【问题标题】:using fabric8 docker-maven-plugin in a Jenkins docker container在 Jenkins docker 容器中使用 fabric8 docker-maven-plugin
【发布时间】:2019-08-28 12:57:35
【问题描述】:

我正在使用fabric8 的docker-maven-plugin 来构建和推送我的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 && 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 映像作为我的root 构建我自己的docker 映像。

然后我登录到 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]

注意 Jenkins 运行的命令

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

它使用我在 Jenkins 管道中使用的 maven 工具 'm3' 并运行 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 ui 运行它时。 jenkins UI 是否使用了不同的用户?

【问题讨论】:

  • 进入容器后,与哪个用户一起执行了“mvn”cmd?詹金斯用户?
  • @RohitJindal 是的,当我以 jenkins 用户身份进入容器并运行相同的命令时它可以工作!!!
  • 在上面提到的序列中,首先你启动了 Jenkins,然后你在 docker 组中添加了 jenkins 用户。如果是这种情况,更改不会反映在 Jenkins 服务器上。但是当您当时手动执行时,jenkins 添加到 docker 组中。测试 - 创建一个测试作业并执行脚本“id -a”。这将显示当时与 Jenkins 相关联的用户 Jenkins 组。从容器内部执行相同的 cmd。如果有区别,我建议你创建一个包含上述所有安装和 useradd 的 dockerfile,然后启动 Jenkins。
  • @RohitJindal 在测试 jub 和容器中运行这些命令时,您是绝对正确的,它们会产生不同的结果。在我的测试工作中 - uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins) 在容器中 - uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins),999(docker) .一旦我通过您的建议,如果您做出上述回答,我将接受它。
  • 感谢您验证建议。我已将其添加为答案。

标签: docker jenkins fabric8 docker-maven-plugin


【解决方案1】:

在上面提到的序列中,首先你启动了 Jenkins,然后你在 docker 组中添加了 jenkins 用户。如果是这种情况,更改不会反映在 Jenkins 服务器上。但是当您手动执行时,当时 jenkins 添加到 docker 组。测试 - 创建一个测试作业并执行脚本“id -a”。这将在该时间点显示用户 Jenkins 的组。从容器内部执行相同的 cmd。如果有差异,我建议您创建一个包含上述所有安装和 useradd 的 dockerfile,然后启动 Jenkins。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2017-11-17
    相关资源
    最近更新 更多