Подключение к докеру в докере от лидера GitLab CI

У меня есть конвейер GitLab, который я хочу:

  1. Создайте приложение Java
  2. Тестирование с использованием докеров
  3. Нажмите на мой репозиторий Docker

Основная проблема, с которой я сталкиваюсь, заключается в том, что это работает:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: docker:latest
  script:
  - docker version

Выход печатается, как ожидалось:

> gitlab-ci-multi-runner exec docker --docker-privileged docker_test
...
$ docker version
Client:
 Version:      17.06.0-ce
...
Server:
 Version:      17.06.0-ce
...
Build succeeded

Хотя это не так (шаги установки для docker-ce опущены):

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest       << note change
  script:
  - docker version

Он терпит неудачу:

$ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:23:31 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Build failed: exit code 1
FATAL: exit code 1

Как сделать мой образ ubuntu (или любое другое изображение, которое будет собирать мой проект) подключиться к связанной службе Docker-in-Docker? Что такое docker:latest, что я не делаю?

Я прочитал документацию по сервисам GitLab, но это имеет смысл только с точки зрения имени хоста. (Если у вас есть служба mysql, вы можете подключиться через mysql:3306)

Изменить: Обновление команды для echo $DOCKER_HOST, я вижу в docker:latest изображение:

$ echo $DOCKER_HOST
tcp://docker:2375

И в ubuntu:latest изображение я вижу:

$ echo $DOCKER_HOST
(nothing - but SO doesn't let me add a blank code line)

Ответы

Ответ 1

Как добавленная вами информация, я надеюсь, что это сработает:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest
  variables:
      DOCKER_HOST: "tcp://docker:2375"
  script:
  - docker version

В качестве альтернативы:

services:
  - docker:dind

docker_test:
  stage: docker_test
  image: ubuntu:latest 
  script:
  - export DOCKER_HOST=tcp://docker:2375
  - docker version

Похоже, что Gitlab не устанавливает переменную DOCKER_HOST для пользовательских изображений.

Ответ 2

Бегун Gitlab CI должен подключить гнездо док-станции хостов, чтобы выпустить докер в докере. Например:

docker exec gitlab-runner gitlab-runner register \
           --non-interactive \
           --url https://gitlab.com/ci \
           --registration-token TOKEN\
           --description "Docker Runner" \
           --tag-list "docker" \
           --executor docker \
           --docker-image "docker:latest" \
           --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Как вы видите, docker.sock устанавливается здесь как последний параметр. Однако я бы не рекомендовал использовать docker-compose для Gitlab CI, поскольку Gitlab CI имеет свой собственный синтаксис https://docs.gitlab.com/ce/ci/docker/using_docker_images.html