Назад | Перейти на главную страницу

Процесс gitlab-runner в контейнере не может найти контейнер gitlab при использовании docker-compose

Обновить: Я не решил проблему, но знаю, почему она не работает. Если вы используете программу-исполнитель docker, при запуске задания двоичный файл gitlab-runner запускает специальный контейнер. Этот контейнер является gitlab-runner-helper и будет управлять git, кешами и т. Д.
Контейнер запускается путем вызова API-интерфейса Docker Engine, запущенного на хосте (локальном хосте, физическом компьютере). Но поскольку он запускается «вручную», он не связан ни с какой мостовой сетью. Или, по крайней мере, не связан с сетью docker-compose. Итак, помощник даже не знает, что этот контейнер gitlab существует.

Эта проблема:

Я просто хочу, чтобы на моем локальном хосте работали gitlab и gitlab-runner (с использованием программы-исполнителя docker). Я хочу установить их и управлять ими с помощью docker и docker-compose.

docker-compose.yml:

gitlab:
  container_name: my-container-gitlab
  image: gitlab/gitlab-ce:latest
  ports:
    - "443:443"
    - "9090:80"
    - "22:22"
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://gitlab'
  volumes:
    - ./gitlab/config:/etc/gitlab
    - ./gitlab/logs:/var/log/gitlab
    - ./gitlab/data:/var/opt/gitlab

gitlab-runner:
  container_name: my-container-gitlab-runner
  image: gitlab/gitlab-runner:latest
  volumes:
     - ./gitlab-runner/config:/etc/gitlab-runner
     - /var/run/docker.sock:/var/run/docker.sock

Gitlab работает как шарм.
Также работает регистрация бегуна:

docker-compose run gitlab-runner register -n \
    --url http://gitlab/ \
    --registration-token xxxxxxxxxx \  
    --executor docker \
    --docker-image alpine \ 
    --description "My Docker Runner"

Но при запуске задания из веб-интерфейса Gitlab я получаю следующее:

Running with gitlab-runner 11.11.2 (ac2a293c)
      on My Docker Runner sBqMfFys
    Using Docker executor with image alpine ...
    Pulling docker image alpine ...
    Using docker image sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1 for alpine ...
    Running on runner-sBqMfFys-project-1-concurrent-0 via 881cd3e0423c...
    Initialized empty Git repository in /builds/root/bertrand-malvaux/.git/
    Fetching changes...
    Created fresh repository.
    fatal: unable to access 'http://gitlab-ci-token:[MASKED]@gitlab/root/bertrand-malvaux.git/': 
Could not resolve host: gitlab
    ERROR: Job failed: exit code 1  

Что я исследовал до сих пор:

Но, как вы можете видеть в приведенной выше ошибке, двоичный файл не «видит» имя хоста gitlab. Я изменил изображение, чтобы проверить, видит ли он контейнер gitlab вне двоичного файла только с помощью dumb-init, и ответ - да.

Ты хоть представляешь, как это сделать?

Итак, поскольку я сам столкнулся с этой проблемой, я подумал, что отвечу здесь со своим исправлением и объяснением:

В моей домашней лаборатории есть установка докеров git-lab, и я использую docker-compose для развертывания серверов gitlab и gitlab-runner. Это создает сеть, которая связывает их вместе, позволяя распознавать имена хостов внутри контейнеров ... но не извне созданной сети.

Я обнаружил, что Gitlab-runner по умолчанию запускает контейнер при запуске теста и добавляет его в «мостовую» сеть докеров. Если вы используете док-станцию, вы можете увидеть это, проверив информацию о созданном контейнере до его остановки или запустив docker inspect для него: docker inspect --format='{{.NetworkSettings.Networks}}' <runner temp container_id>

У меня был еще один контейнер, работающий на мосту, и я проверил, разрешится ли gitlab. Это не так.

Soooooooo ..... есть настройка, которую вы можете передать в config.toml gitlab-runner:

[[runners]]
...
  [runners.docker]
    network_mode= <----- THIS

Этот параметр сообщит gitlab-runner, в какой сети разместить контейнер, когда он будет запущен, поэтому, если вы знаете имя сети, в которой работают ваши gitlab и gitlab-контейнеры:

docker inspect --format='{{.NetworkSettings.Networks}}' <gitlab container id>

затем добавьте это в качестве сетевого режима (мое имя сети - git-lab_default):

[[runners]]
...
  [runners.docker]
    network mode= "git-lab_default"

Тогда вуаля! Ваши тестовые контейнеры будут в одной сети, и все будет в порядке.

Надеюсь, это поможет кому-нибудь с проблемой.