#docker #jenkins #fabric8 #docker-maven-plugin
#docker #дженкинс #fabric8 #docker-maven-plugin
Вопрос:
Я использую docker-maven-plugin от fabric8 для сборки и отправки моего образа docker. Я делаю что-то вроде:
mvn docker:build
как в моей среде разработки, так и в Jenkins. Но вот моя проблема.
У меня 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 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=18.06.1~ce~3-0~debian
наконец, я добавляю jenkins
пользователя в docker
группу
useradd -G {docker} jenkins
На самом деле я создам свой собственный образ docker, используя jenkins/jenkins
изображение в качестве своего root, используя вышеупомянутые команды.
Затем я вхожу в 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
и жалуется на разрешения
Вот в чем загвоздка. Я захожу в контейнер jenkins
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 другого пользователя?
Комментарии:
1. После перехода в контейнер с каким пользователем вы выполнили «mvn» cmd? Пользователь Jenkins?
2. @RohitJindal да, когда я захожу в контейнер как пользователь jenkins и запускаю ту же команду, она работает!!!
3. В приведенной выше последовательности сначала вы запустили Jenkins, а затем добавили пользователя jenkins в группу docker. в этом случае изменения не отражаются на сервере Jenkins. но когда вы выполняете вручную в то время, Дженкинс добавлен в группу docker. Для тестирования — создайте тестовое задание и выполните скрипт «id -a». это покажет группу для пользователя Jenkins, которая связана с Jenkins на данный момент времени. тот же cmd выполняется изнутри контейнера. если есть разница, я бы посоветовал вам создать dockerfile со всеми вышеупомянутыми установками и useradd, а затем запустить Jenkins.
4. @RohitJindal вы абсолютно правы, когда запускаете эти команды в тестовом jub и в контейнере, они дают разные результаты. в моем тестовом задании — uid= 1000 (дженкинс) gid= 1000 (дженкинс) groups= 1000(дженкинс) в контейнере — uid=1000(дженкинс) gid=1000(дженкинс) groups=1000(дженкинс),999(докер). Как только я рассмотрю ваше предложение, и если вы дадите вышеуказанный ответ, я приму его.
5. Спасибо за подтверждение предложения. Я добавил его в качестве ответа.
Ответ №1:
В приведенной выше последовательности сначала вы запустили Jenkins, а затем добавили пользователя jenkins в группу docker. если это так, изменения не отражаются на сервере Jenkins. но когда вы выполняете вручную, в это время дженкинс добавляется в группу docker. Для тестирования — создайте тестовое задание и выполните скрипт «id -a». на данный момент будут показаны группы для пользователя Jenkins. тот же cmd выполняется изнутри контейнера. если есть разница, я бы посоветовал вам создать dockerfile со всеми вышеупомянутыми установками и useradd, а затем запустить Jenkins.