/var/run/docker.sock: подключение: отказано в разрешении Jenkins slave в кластере ecs

#docker #jenkins #jenkins-pipeline #amazon-ecs

#docker #дженкинс #дженкинс-конвейер #amazon-ecs

Вопрос:

Я использую плагин AWS EC2 для Jenkins, чтобы запускать подчиненные устройства Jenkins при создании задач. При попытке собрать docker внутри контейнера docker возникают проблемы с разрешениями. Я просмотрел десятки других сообщений, и люди часто предоставляют это в качестве ответа:

  1. создайте группу docker
  2. добавьте пользователя jenkins в группу docker
  3. перезапуск
  4. все волшебным образом работает

Дело в том, что я не могу перезапустить, потому что jenkins slave создается с использованием плагина, и я не уверен, как перезапустить его должным образом, чтобы он правильно обрабатывал сборку при перезапуске. Кроме того, это означало бы запустить перезапуск на хосте, несмотря на то, что он находится в контейнере, что звучит как плохая идея.

Я пытался:

  1. Добавление jenkins пользователям sudo в dockerfile RUN adduser jenkins
    sudo
    с последующим RUN echo "jenkins ALL=NOPASSWD: ALL" >>
    /etc/sudoers

  2. Изменение владельца файла сокета docker RUN chown root:jenkins /var/run/docker.sock

  3. Изменение разрешений сокета docker chmod 777 /var/run/docker.sock

  4. Использую 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:

Я также столкнулся с этой проблемой, мне нужно выполнить следующие шаги, чтобы она заработала:

  1. Обновите файл docker для установки docker-клиента.
  2. Обновите конфигурацию ECS Cloud Jenkins, чтобы выполнить монтирование volumen, т. е. /var/run/docker.sock
  3. Наиболее важной частью является выполнение команд 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