Подключение к докеру в докере от лидера GitLab CI
У меня есть конвейер GitLab, который я хочу:
- Создайте приложение Java
- Тестирование с использованием докеров
- Нажмите на мой репозиторий 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