Лидер GitLab CI не может подключиться к unix:///var/run/docker.sock в кубернетах
GitLab работает в кластере kubernetes. Бегун не может построить изображение докеров с артефактами сборки. Я уже пробовал несколько подходов, чтобы исправить это, но не повезло. Вот некоторые фрагменты настроек:
.gitlab-ci.yml
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
stages:
- build
- package
- deploy
maven-build:
image: maven:3-jdk-8
stage: build
script: "mvn package -B --settings settings.xml"
artifacts:
paths:
- target/*.jar
docker-build:
stage: package
script:
- docker build -t gitlab.my.com/group/app .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
- docker push gitlab.my.com/group/app
config.toml
concurrent = 1
check_interval = 0
[[runners]]
name = "app"
url = "https://gitlab.my.com/ci"
token = "xxxxxxxx"
executor = "kubernetes"
[runners.kubernetes]
privileged = true
disable_cache = true
Журнал этапа пакета:
running with gitlab-ci-multi-runner 1.11.1 (a67a225)
on app runner (6265c5)
Using Kubernetes namespace: default
Using Kubernetes executor with image docker:latest ...
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Waiting for pod default/runner-6265c5-project-4-concurrent-0h9lg9 to be running, status is Pending
Running on runner-6265c5-project-4-concurrent-0h9lg9 via gitlab-runner-3748496643-k31tf...
Cloning repository...
Cloning into '/group/app'...
Checking out 10d5a680 as master...
Skipping Git submodules setup
Downloading artifacts for maven-build (61)...
Downloading artifacts from coordinator... ok id=61 responseStatus=200 OK token=ciihgfd3W
$ docker build -t gitlab.my.com/group/app .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
ERROR: Job failed: error executing remote command: command terminated with non-zero exit code: Error executing in Docker Container: 1
Что я делаю неправильно?
Ответы
Ответ 1
Не нужно использовать это:
DOCKER_DRIVER: overlay
похоже, что OVERLAY не поддерживается, поэтому контейнер svc-0 не может начать с него:
$ kubectl logs -f `kubectl get pod |awk '/^runner/{print $1}'` -c svc-0
time="2017-03-20T11:19:01.954769661Z" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]"
time="2017-03-20T11:19:01.955720778Z" level=info msg="libcontainerd: new containerd process, pid: 20"
time="2017-03-20T11:19:02.958659668Z" level=error msg="'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded."
Кроме того, добавьте export DOCKER_HOST="tcp://localhost:2375"
в docker-build:
docker-build:
stage: package
script:
- export DOCKER_HOST="tcp://localhost:2375"
- docker build -t gitlab.my.com/group/app .
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN gitlab.my.com/group/app
- docker push gitlab.my.com/group/app
Ответ 2
При использовании Kubernetes вы должны настроить свой образ сборки для подключения к движку Docker.
Добавьте к вашему образу сборки:
DOCKER_HOST=tcp://localhost:2375
Цитата из документов:
Запуск docker: dind, также известный как образ docker-in-docker, также возможен, но, к сожалению, необходимо, чтобы контейнеры запускались в привилегированном режиме. Если вы готовы пойти на такой риск, могут возникнуть другие проблемы, которые на первый взгляд могут показаться не такими уж простыми. Поскольку демон docker запускается как служба, обычно в вашем.gitlab-ci.yaml, он будет запускаться как отдельный контейнер в вашем модуле. В основном контейнеры в модулях разделяют только назначенные им тома и IP-адреса, по которым они могут связываться друг с другом с помощью localhost. /var/run/docker.sock не используется контейнером docker: dind, и двоичный файл docker пытается использовать его по умолчанию. Чтобы перезаписать это и заставить клиента использовать tcp для связи с демоном docker в другом контейнере, обязательно включите DOCKER_HOST = tcp://localhost: 2375 в переменные среды контейнера сборки.
Gitlab-CI на Кубернетес
Ответ 3
У меня та же проблема, исправленная по этой ссылке
Ответ 4
на основании комментария @Yarik у меня получилось
- export DOCKER_HOST=$DOCKER_PORT
другие ответы не сработали.