Docker логин в AWS ECR из GitLab CI не удается с ошибкой “dial tcp: lookup docker on x.x.x.x:53: no such host” при получении docker:dind из ECR.

Вопрос или проблема

Я работаю над переносом коллекции образов 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.

Оцените материал
Добавить комментарий

Капча загружается...