Gitlab CI не может извлекать изображение из частного реестра докеров

Я хотел бы создать Docker на основе Gitlab CI runner, который вытаскивает изображения докеров для сборки из частного реестра Docker (v2). Я не могу заставить Gitlab Runner вытащить изображение из локального реестра, он пытается получить что-то из API /v1. Появляется следующее сообщение об ошибке:

ОШИБКА: Ошибка сборки: Ошибка при извлечении изображения: Get http://registry:5000/v1/repositories/maven/images: наберите tcp: lookup registry на 127.0.1.1:53: no такой хост

Вот минимальный пример, использующий docker-compose и веб-браузер.

У меня есть следующий docker-compose.yml файл:

version: "2"

services:
  gitlab:
    image: gitlab/gitlab-ce
    ports:
      - "22:22"
      - "8080:80"
    links:
      - registry:registry

  gitlab_runner:
    image: gitlab/gitlab-runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    links:
      - registry:registry
      - gitlab:gitlab

  registry:
    image: registry:2

После первого входа в Gitlab я зарегистрирую бегун в экземпляр Gitlab:

[email protected]:/# gitlab-runner register
Running in system-mode.                            

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
http://192.168.61.237:8080/ci         
Please enter the gitlab-ci token for this runner:
tE_1RKnwkfj2HfHCcrZW
Please enter the gitlab-ci description for this runner:
[130d08732613]: docker
Please enter the gitlab-ci tags for this runner (comma separated):

Registering runner... succeeded                     runner=tE_1RKnw
Please enter the executor: docker-ssh+machine, docker, docker-ssh, parallels, shell, ssh, virtualbox, docker+machine:
docker
Please enter the default Docker image (eg. ruby:2.1):
maven:latest
Runner registered successfully. Feel free to start it, but if it running already the config should be automatically reloaded!

После этого я вижу бегун Gitlab в моем экземпляре Gitlab:

Gitlab Runner в экземпляре Gitlab

После этого я нажимаю простое изображение maven в свой недавно созданный репозиторий Docker:

[email protected]:~/$ docker tag maven:3-jdk-7 172.19.0.2:5000/maven:3-jdk7
[email protected]:~/$ docker push 172.19.0.2:5000/maven:3-jdk7 
The push refers to a repository [172.19.0.2:5000/maven]
79ab7e0adb89: Pushed 
f831784a6a81: Pushed 
b5fc1e09eaa7: Pushed 
446c0d4b63e5: Pushed 
338cb8e0e9ed: Pushed 
d1c800db26c7: Pushed 
42755cf4ee95: Pushed 
3-jdk7: digest: sha256:135e7324ccfc7a360c7641ae20719b068f257647231d037960ae5c4ead0c3771 size: 1794

(Я получил IP-адрес 172.19.0.2 с выхода команды docker inspect)

После этого я создаю тестовый проект в Gitlab и добавляю простой файл .gitlab-ci.yml:

image: registry:5000/maven:3-jdk-7

stages:
  - build
  - test
  - analyze

maven_build:
  stage: build
  script:
    - "mvn -version"

И после сборки Gitlab дает ошибку, увиденную в начале сообщения.

Если я войду в рабочий контейнер gitlab-runner, я могу получить доступ к реестру по указанному URL-адресу:

[email protected]:~/$ docker exec -it comptest_gitlab_runner_1 bash
[email protected]:/# curl http://registry:5000/v2/maven/tags/list
{"name":"maven","tags":["3-jdk7"]}
[email protected]:/# exit
exit
[email protected]:~/$

Но ошибка все та же:

Бегущий Gitlab в экземпляре Gitlab

У вас есть идея, как заставить gitlab-runner использовать v2 api частного реестра?

Ответ 1

Более новые Gitlab и Gitlab Runners поддерживают это, см.: https://docs.gitlab.com/runner/configuration/advanced-configuration.html#using-a-private-container-registry

На старом Gitlab я решил эту проблему копированием ключа авторизации в ~/.docker/config.json

{
        "auths": {
                "my.docker.registry.url": {
                        "auth": "dmlsbW9zLm5hZ3k6VGZWNTM2WmhC"
                }
        }
}

Я вошел в этот контейнер со своего компьютера и скопировал этот ключ авторизации в докер-контейнер Gitlab Runner.

Ответ 2

Какую версию докера вы используете на Gitlab? Также для реестра v2 вы должны явно разрешить небезопасный реестр с помощью командной строки или защитить свой реестр с помощью сертификата.

В противном случае откат Docker к реестру v1, если он получает исключение безопасности.