Ах, это моя любимая тема - использовать docker
для gitlab ci
.Проблема, с которой вы столкнулись, более известна как docker-in-docker
.
Перед ее настройкой вы можете прочитать этот блестящий пост: http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
Это даст вам некоторое представление о том, чтоэто проблема, и какое решение лучше всего подходит вам.Обычно существует 2 основных подхода: фактическая установка docker
демона внутри docker
и совместное использование демона хоста с контейнерами.Какой подход выбрать - зависит от ваших потребностей.
В gitlab
вы можете пойти несколькими путями, я просто поделюсь нашим опытом.
Способ 1 - с помощью docker:dind
как услуга.
Это довольно просто настроить.Просто добавьте docker:dind
в качестве общей службы в ваш файл gitlab-ci.yml
и используйте изображение docker:latest
для своей работы.
image: docker:latest # this sets default image for jobs
services:
- docker:dind
Плюсы :
- прост в настройке.
- просто для запуска - ваши исходные коды доступны по умолчанию для вашей работы в
cwd
, потому что они перетаскиваются непосредственно в ваш докер-бегун
Минусы : вы должны настроить реестр Docker для этой службы, в противном случае ваши Dockerfile
будут собираться с нуля при каждом запуске конвейера.Что касается меня, это неприемлемо, потому что это может занять более часа в зависимости от количества имеющихся у вас контейнеров.
Способ 2 - совместное использование /var/run/docker.sock
хоста docker daemon
Мы настроили нашего собственного исполнителя docker с помощью docker daemon и поделились сокетом, добавив его в файл /etc/gitlab-runner/config.toml
.Таким образом, мы сделали демон докера нашей машины доступным docker cli
внутри контейнеров. Примечание - вам НЕ нужен привилегированный режим для исполнителя в этом случае.
После этого мы можем использовать и docker
и docker-compose
в наших пользовательских изображениях докера.Более того, нам не нужен специальный реестр докеров, потому что в этом случае мы разделяем реестр исполнителя между всеми контейнерами.
Минусы
Вам нужно как-то передать источники в ваши контейнеры в этомслучай, потому что вы подключаете их только к исполнителю Docker, но не к контейнерам, запускаемым из него.Мы остановились на клонировании их с помощью команды вроде git clone $CI_REPOSITORY_URL --branch $CI_COMMIT_REF_NAME --single-branch /project