Вопрос или проблема
Я работаю над переносом коллекции образов Docker, используемых для сборки и развертывания в GitLab CI/CD, с Dockerhub на публичный ECR AWS. Все работает так, как должно, за исключением стандартного образа Docker, который мы используем как услугу Docker-in-Docker. Тот же самый образ, который работает при скачивании с Dockerhub, не удается войти, когда он загружается из публичного ECR.
.gitlab-ci.yml
build-push:
stage: package
image: public.ecr.aws/x/x
services:
- public.ecr.aws/x/docker-dind:20.10
$ aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_DOCKER_REGISTRY_URL
> Вход в реестр Docker...
> ошибка при подключении: Post http://docker:2375/v1.24/auth: dial tcp: lookup docker on 8.8.8.8:53: нет такого хоста
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 public.ecr.aws__*
172.17.0.2 public.ecr.aws-*
172.17.0.3 runner-*
Спасибо.
Чтобы решить эту проблему, просто добавьте в /etc/gitlab-runner/config.toml объем для docker sock.
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
При сборке образа docker в gitlab-ci вы должны добавить это (dind
означает “docker в docker”):
services:
- docker:dind
Согласно документации GitLab документации, при использовании пользовательского образа dind ожидается, что будет указан хост Docker. Чтобы это исправить, вам нужно добавить псевдоним в вашу конфигурацию CI GitLab следующим образом:
build-push:
stage: package
image: public.ecr.aws/x/x
services:
- name: public.ecr.aws/x/docker-dind:20.10
- alias: docker
Также не уверен в вашей настройке, но по Convention предпочтительно добавлять -dind
в конце имени образа. Поэтому это должно быть public.ecr.aws/x/docker:20.10-dind
Как упомянул @orban https://serverfault.com/users/190624/orb%c3%a1n-zolt%c3%a1n
Просто добавьте “privileged=true” в /etc/gitlab-runner/config.toml
например
[runners.docker]
tls_verify = false
image = "ruby:2.7"
privileged = true <- измените это с false на true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
Возможно, вам потребуется добавить --docker-network-mode "host"
в конфигурацию GitLab runner. Перед этим я получил следующую ошибку (предполагая, что “dind” – это имя хоста, а не “docker”):
ERROR: ошибка при подключении: Get http://dind:2375/v1.40/info: dial tcp: lookup dind on 8.8.8.8:53: нет такого хоста
Это может быть некорректная конфигурация вашей среды Docker. По какой-то причине, похоже, что имя docker
(из http://docker:2375/v1.24/auth
URL) разрешается через 8.8.8.8
Google nameserver. Это не может работать, очевидно.
Попробуйте добавить запись 127.0.0.1 docker
в ваш /etc/hosts
– это может помочь (127.0.0.1 означает localhost).
Ответ или решение
К сожалению, у вас возникла проблема с входом в Amazon ECR (Elastic Container Registry) через GitLab CI/CD, когда вы пытаетесь использовать Docker-in-Docker (dind) сервис. Ошибка "dial tcp: lookup docker on x.x.x.x:53: no such host" указывает на проблему разрешения имени хоста для Docker. Рассмотрим это подробнее и предложим пути решения.
1. Понимание Проблемы
Ошибка, которую вы видите, возникает из-за того, что система пытается разрешить имя docker
, которое, как ожидается, ссылается на сервис Docker внутри GitLab CI/CD. Если имя не удается разрешить, появляется ошибка, которая указывает на проблему с DNS-разрешением.
2. Настройка GitLab CI/CD
a. Конфигурация .gitlab-ci.yml
Чтобы убедиться, что ваш сервис dind правильно настроен, добавьте alias для него в конфигурацию вашей задачи. Это поможет правильно связать ваш сервис dind с именем хоста docker
. Вот как это можно сделать:
build-push:
stage: package
image: public.ecr.aws/x/x
services:
- name: public.ecr.aws/x/docker-dind:20.10
alias: docker
b. Привилегированный режим
Добавление privileged=true
в конфигурацию GitLab Runner также поможет избежать некоторых проблем, связанных с разрешением и запуском контейнеров:
[runners.docker]
privileged = true
3. Обновление Hosts
Иногда обновление файла /etc/hosts
может помочь системе правильно разрешать имена. Попробуйте добавить следующую строку в файл:
127.0.0.1 docker
Это укажет системе, что docker
это локальный хост, и должно устранить некоторые проблемы с DNS.
4. Настройки Сети
Если у вас есть специфические настройки сети, добавление параметра --docker-network-mode "host"
в конфигурацию GitLab Runner может помочь. Это решит проблемы с подключением к Docker, особенно если у вас конфигурация, использующая нестандартные сети.
5. Проверка Образы
Убедитесь, что вы используете правильный образ Docker. Это должно быть public.ecr.aws/x/docker:20.10-dind
для Docker-in-Docker. Убедитесь, что формат имени образа отвечает требованиям.
6. Заключение
Следуя вышеуказанным рекомендациям, вы сможете устранить ошибку входа в ECR через GitLab CI/CD. Основное внимание следует уделить правильной конфигурации файла .gitlab-ci.yml
, привилегированным настройкам и корректному разрешению имен. Убедитесь, что необходимые зависимости и ссылки настроены правильно, чтобы обеспечить плавный опыт работы с Docker-in-Docker в вашем процессе CI/CD.