У меня есть рабочий процесс для публикации webapps на моем dev-сервере. На сервере есть один хост-докер, и я использую docker-compose для управления контейнерами.
- Нажимайте изменения в моем приложении на приватную gitlab (работает в докере). Приложение включает в себя Dockerfile и docker-compose.yml
- Gitlab запускает сборку jenkins (jenkins также работает в докере), что делает некоторые обычные сборки (например, run test)
- Затем Дженкинс должен создать новое изображение докеры и развернуть его, используя компоновку docker.
Проблема заключается в шаге 3. Как я ее настроил, контейнер jenkins имеет доступ к докере хоста, так что запуск любой команды docker
в сборке script по существу такой же, как при запуске на хосте. Это делается с использованием следующих DockerFile
для jenkins:
FROM jenkins
USER root
# Give jenkins access to docker
RUN groupadd -g 997 docker
RUN gpasswd -a jenkins docker
# Install docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
USER jenkins
и отображение следующих томов в контейнер jenkins:
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker
Типичная сборка script в jenkins выглядит примерно так:
docker-compose build
docker-compose up
Это работает нормально, но есть две проблемы:
-
Это действительно похоже на хак. Но единственными другими опциями, которые я нашел, является использование плагина docker для jenkins, публикация в реестре и последующий способ сообщить хозяину, что он должен перезапустить. Это довольно много движущихся частей, а плагин docker-jenkins требует, чтобы хост-докер находился на открытом порту, который я действительно не хочу раскрывать.
-
Jenkins DockerFile включает
groupadd -g 997 docker
, который необходим, чтобы дать пользователю jenkins доступ к докере. Однако GID (997) является GID на главной машине и поэтому не переносится.
Я не уверен, какое решение я ищу. Я не вижу практического способа обойти этот подход, но было бы неплохо, если бы был способ разрешить выполнение команд докеров в контейнере jenkins без необходимости жесткого кода GID в DockerFile. У кого-нибудь есть предложения по этому поводу?