Jenkins管道中的Docker代理卷安装无法按预期工作

时间:2019-08-30 03:03:17

标签: docker jenkins-pipeline maven-3 docker-volume

在带有卷装入的代码段之后,在$JENKINS_HOME/workspace/<project-name>/?(问号)下而不是在$HOME/.m2/下创建maven依赖项

请注意,settings.xml镜像到我们的内部资源库。有关如何安装的说明直接取自jenkins.io

任何人都知道为什么会这样吗?

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /tmp/jenkins/.m2:/root/.m2:rw,z'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install -s settings.xml'
            }
        }
    }
}

这不像独立使用Docker那样简单。我在运行构建的Jenkins从属服务器上创建了/var/jenkins/.m2目录。确保新目录具有775权限(尽管可能不是必需的),并且还将所有者更改为与“ / var / opt / slave / workspace / pipeline_test”相同(根据以下日志获取此路径)< / p>

$ docker login -u dcr-login -p ******** https://   nexus.corp.zenmonics.com:8449
Login Succeeded
[Pipeline] {
[Pipeline] sh
+ docker inspect -f . nexus.corp.zenmonics.com:8449/maven:3-alpine
.
[Pipeline] withDockerContainer
cucj1sb3 does not seem to be running inside a container
$ docker run -t -d -u 1002:1002 -v /tmp/jenkins/.m2:/root/.m2:rw,z -w 
/var/opt/slave/workspace/pipeline_test -v /var/opt/slave/workspace/pipeline_test:/var/opt/slave/workspace/pipeline_test:rw,z -v /var/opt/slave/workspace/pipeline_test@tmp:/var/opt/slave/workspace/pipeline_test@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** nexus.corp.zenmonics.com:8449/maven:3-alpine cat
$ docker top c7282468dbb6952aadbe4bb495757e7047122b179c81516645ba23759b78c366 -eo pid,comm

关于Docker Hub(https://hub.docker.com/_/maven)上官方maven映像的声明使我感到卷挂载已更新

  

要创建预打包的存储库,请使用以下命令创建pom.xml:   您需要的依赖项,并在Dockerfile中使用它。   /usr/share/maven/ref/settings-docker.xml是一个设置文件   将本地存储库更改为/ usr / share / maven / ref / repository,但是   您可以使用自己的设置文件,只要它使用   / usr / share / maven / ref / repository作为本地存储库。

2 个答案:

答案 0 :(得分:1)

正如@masseyb在评论中提到的那样,詹金斯将$HOME视为当前的建筑环境。

有两种解决方法:

a)使用Jenkins插件设置Env变量

您可以使用Envinject Plugin在Jenkins中设置环境变量。

b)指定绝对路径,而不是$HOME/.m2

您可以为.m2指定绝对路径,例如:

pipeline {
    agent {
        docker {
            image 'maven:3-alpine'
            args '-v /home/samir-shail/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B'
            }
        }
    }
}

注意:请检查Jenkins是否有权访问您的$HOME/.m2/目录。

答案 1 :(得分:1)

https://jenkins.io/doc/book/pipeline/docker/上的文档在进行批量安装时具有误导性并且浪费时间。

创建Docker容器时,它是使用用户1002和组1002创建的。用户1002无权访问/root/.m2,而只能访问注入到该容器中的工作目录。

Dockerfile

Seq

Settings.xml

FROM maven:3-alpine

COPY --chown=1002:1002 repository/ /usr/share/maven/ref/repository/

RUN chmod -R 775 /usr/share/maven/ref/repository

COPY settings.xml /usr/share/maven/ref/

Docker命令

<localRepository>/usr/share/maven/ref/repository</localRepository>

Jenkinsfile

docker build -t <server>:<port>/<image-name>:<image-tag> .
docker push <server>:<port>/<image-name>:<image-tag>
docker volume create maven-repo