#docker #jenkins #jenkins-pipeline #amazon-ecs
#docker #дженкинс #дженкинс-конвейер #amazon-ecs
Вопрос:
Я использую плагин AWS EC2 для Jenkins, чтобы запускать подчиненные устройства Jenkins при создании задач. При попытке собрать docker внутри контейнера docker возникают проблемы с разрешениями. Я просмотрел десятки других сообщений, и люди часто предоставляют это в качестве ответа:
- создайте группу docker
- добавьте пользователя jenkins в группу docker
- перезапуск
- все волшебным образом работает
Дело в том, что я не могу перезапустить, потому что jenkins slave создается с использованием плагина, и я не уверен, как перезапустить его должным образом, чтобы он правильно обрабатывал сборку при перезапуске. Кроме того, это означало бы запустить перезапуск на хосте, несмотря на то, что он находится в контейнере, что звучит как плохая идея.
Я пытался:
-
Добавление jenkins пользователям sudo в dockerfile
RUN adduser jenkins
с последующим
sudoRUN echo "jenkins ALL=NOPASSWD: ALL" >>
/etc/sudoers -
Изменение владельца файла сокета docker
RUN chown root:jenkins /var/run/docker.sock
-
Изменение разрешений сокета docker
chmod 777 /var/run/docker.sock
-
Использую
newgrp
, чтобы мне не приходилось перезапускать docker извне контейнера
В принципе, как мне обойти необходимость не перезапускать службу docker, одновременно предоставляя разрешения sudo для сборки dockerfiles внутри подчиненного контейнера jenkins? Или, если я действительно могу перезапустить, все еще используя плагин EC2, как мне лучше всего это сделать?
Текущий файл dockerfile:
FROM jenkins/jnlp-slave
USER root
RUN apt-get update amp;amp;
apt-get -y install apt-transport-https
ca-certificates
curl
gnupg2
software-properties-common amp;amp;
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey amp;amp;
add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")
$(lsb_release -cs)
stable" amp;amp;
apt-get update amp;amp;
apt-get -y install docker-ce amp;amp;
apt-get -y install sudo
VOLUME /var/run/docker.sock
RUN adduser jenkins sudo
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
RUN usermod -aG docker jenkins
RUN chmod 777 /var/run/docker.sock
RUN chown root:jenkins /var/run/docker.sock
USER jenkins
Спасибо!
Комментарии:
1. Было бы приятно увидеть
docker run
команду2. Я не совсем уверен, что это за
docker run
команда для slave, поскольку она обрабатывается плагином, но я предполагаю, что это что-то похожее наdocker run jenkins/jnlp-slave -url http://jenkins-server:port <secret> <agent name>
3. Вы можете использовать аналогичный метод из этого для настройки агентов Jenkins с доступом к сокету docker: github.com/sudo-bmitch/jenkins-docker
4. Обычно мы не устанавливаем docker в контейнер, вместо этого мы устанавливаем docker на хост и монтируем docker client exe и docker socket в контейнер jenkins. Это означает, что все команды docker выполняются на хосте, а не в контейнере… Затем
sudo docker ...
работает нормально…
Ответ №1:
Я также столкнулся с этой проблемой, мне нужно выполнить следующие шаги, чтобы она заработала:
- Обновите файл docker для установки docker-клиента.
- Обновите конфигурацию ECS Cloud Jenkins, чтобы выполнить монтирование volumen, т. е.
/var/run/docker.sock
-
Наиболее важной частью является выполнение команд docker внутри контейнера. Есть два варианта:
i. запустите containerUser от имени
root
пользователя. это наиболее удобный шаг при запуске контейнера от имени пользователя root, если вас устраиваетii. добавьте пользователя jenkins в группу docker на хосте
usermod -a -G docker jenkins
Получите gid группы docker и сопоставьте gid внутри контейнера. Обновите gid контейнера docker до gid хоста. Таким образом, вы не получите
permission denied
ошибку и вам не нужно делатьchown 777 /var/run/docker.sock