Использование Fabric8 docker-maven-plugin в док-контейнере Jenkins

Я использую докер-maven-плагин от Fabric8 для создания и отправки своего образа докера. Я делаю что-то вроде:

mvn docker:build

как в моей среде разработки, так и в Jenkins. Но вот моя проблема.

У меня Дженкинс работает в Docker Swarm.

docker service create --name jenkins -p 8080:8080 -p 50000:50000 --replicas=1 --mount type=volume,src=jenkins_home,dst=/var/jenkins_home --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock jenkins/jenkins

Обратите внимание, что у меня есть привязка монтирования хоста /var/run/docker.sock к контейнеру /var/run/docker.sock.

Затем я устанавливаю двоичные файлы Docker внутри контейнера, выполнив:

apt-get update && apt-get -y install apt-transport-https ca-certificates \
curl gnupg2 software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" && \
apt-get update && \ apt-get -y install docker-ce=18.06.1~ce~3-0~debian

наконец, я добавляю пользователя jenkins в группу docker

useradd -G {docker} jenkins

На самом деле я создам свой собственный образ докера, используя образ jenkins/jenkins в качестве корня, используя вышеупомянутые команды.

Затем я вхожу в Jenkins, создаю конвейер следующим образом.

node {
    def mvnHome
    stage('Preparation') { // for display purposes
       git branch: 'branch', credentialsId: 'id', url: 'https://url'
       mvnHome = tool 'm3'
       env.JAVA_HOME = "${tool 'java8'}"
       env.DOCKER_HOST = "unix://var/run/docker.sock"
       env.PATH = "${env.JAVA_HOME}/bin:${env.PATH}"
    }

    stage('Build Docker Image') {
       dir('rms-donation-manager') {
          sh "'${mvnHome}/bin/mvn' clean install docker:build"
       }
    }
}

Когда я запускаю конвейер, я получаю следующую ошибку:

+ /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/m3/bin/mvn clean install docker:build
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building donation-manager 1.0.3-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- docker-maven-plugin:0.28.0:build (default-cli) @ donation-manager ---
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://127.0.0.1:1: Permission denied
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->unix://127.0.0.1:1
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://127.0.0.1:1: Permission denied
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->unix://127.0.0.1:1
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: I/O exception (java.io.IOException) caught when processing request to {}->unix://127.0.0.1:1: Permission denied
Apr 07, 2019 3:21:24 AM org.apache.http.impl.execchain.RetryExec execute
INFO: Retrying request to {}->unix://127.0.0.1:1
[ERROR] DOCKER> Cannot create docker access object  [Permission denied]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.554 s
[INFO] Finished at: 2019-04-07T03:21:24Z
[INFO] Final Memory: 17M/175M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.fabric8:docker-maven-plugin:0.28.0:build (default-cli) on project donation-manager: Cannot create docker access object: Permission denied -> [Help 1]

Обратите внимание на команду, которую выполнил Дженкинс.

/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/m3/bin/mvn clean install docker:build

Он использует инструмент maven «m3», который я использую в конвейере Jenkins, запускаю команду maven mvn clean install docker:build и жалуюсь на разрешения.

Вот это кикер. Я захожу в контейнер Дженкинса

docker exec -it ec4be3dffa62 /bin/bash

Обратите внимание, что я не являюсь пользователем root, я на самом деле пользователь jenkins. Затем я перехожу к своему проекту, где находится файл pom.xml, и запускаю

/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/m3/bin/mvn clean install docker:build

И это работает!!!! Образ построен. Почему это работает, когда я нахожусь внутри контейнера, а не когда я запускаю его из пользовательского интерфейса jenkins. Пользовательский интерфейс jenkins использует другого пользователя?

После входа в контейнер, с каким пользователем вы выполнили команду «mvn»? Пользователь Дженкинса?

Rohit Jindal 07.04.2019 07:31

@RohitJindal да, когда я захожу в контейнер как пользователь jenkins и запускаю ту же команду, она работает!!!

Francisco 07.04.2019 08:32

В приведенной выше последовательности сначала вы запустили Jenkins, а затем добавили пользователя jenkins в группу докеров. в этом случае изменения не отражаются на сервере Jenkins. но когда вы выполняете вручную в это время, jenkins добавляется в группу докеров. Для проверки создайте тестовое задание и выполните скрипт "id -a". это покажет группу для пользователя Jenkins, которая связана с Jenkins в этот момент времени. тот же cmd выполняется изнутри контейнера. если есть разница, я бы посоветовал вам создать файл докеров со всеми вышеперечисленными установками и useradd, а затем запустить Jenkins.

Rohit Jindal 07.04.2019 10:10

@RohitJindal, вы абсолютно правы, когда запускаете эти команды в тестовом джабе, а в контейнере они дают разные результаты. в моем тестовом задании - uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins) в контейнере - uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),999(docker) . Как только я рассмотрю ваше предложение, и если вы ответите выше, я приму его.

Francisco 07.04.2019 15:06

Спасибо за подтверждение предложения. Я добавил это как ответ.

Rohit Jindal 07.04.2019 16:22
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
5
1 274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенной выше последовательности сначала вы запустили Jenkins, а затем добавили пользователя jenkins в группу докеров. в этом случае изменения не отражаются на сервере Jenkins. но когда вы выполняете вручную, в это время jenkins добавляется в группу докеров. Для проверки создайте тестовое задание и выполните скрипт "id -a". это покажет группы для пользователя Jenkins в этот момент времени. тот же cmd выполняется изнутри контейнера. если есть разница, я бы посоветовал вам создать файл докеров со всеми вышеперечисленными установками и useradd, а затем запустить Jenkins.

Другие вопросы по теме