当前位置: 首页 > 知识库问答 >
问题:

Jenkins管道中的Docker代理卷挂载未按预期工作

张砚
2023-03-14

以下带有卷装载的代码段在$JENKINS\u主页/工作区下创建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那么简单。我已经创建了/var/jenkins/。Jenkins slave上运行构建的m2目录。确保新目录具有775权限(尽管这可能不是必需的),并将所有者更改为与“/var/opt/slave/workspace/pipeline\u test”相同的权限(根据下面的日志获取此路径)

$ 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作为本地repo。

共有2个答案

呼延景同
2023-03-14

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

有两种解决方法:

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

您可以为<代码>指定绝对路径。m2,例如:

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

注意:请检查Jenkins是否有权访问您的$主页/。m2//code>目录。

杨俊茂
2023-03-14

文档位于:https://jenkins.io/doc/book/pipeline/docker/在体积安装方面存在误导和浪费时间。

创建Docker容器时,将使用用户1002和组1002创建其容器。用户1002无权访问/root/。m2,并且只能访问注入到容器中的工作目录。

Dockerfile文件

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/

设置。xml

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

Docker命令

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

詹金斯档案

pipeline {
    agent('linux2') { 
        docker {
            label '<slave-label-here>'
            image '<image-name>:<image-tag>'
            registryUrl 'https://<server>:<port>'
            registryCredentialsId '<jenkins-credentials-for-docker-login>'
            args '-v maven-repo:/usr/share/maven/ref/repository/'
        }
    }

    parameters {
        booleanParam(name: 'SONAR', defaultValue: false, description: 'Select this option to run SONAR Analysis')
    }

    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install -s /usr/share/maven/ref/settings.xml -f pom.xml'
            }
        }
    }
}
 类似资料:
  • 我在通知和等待意向方面遇到了很大困难。我正在尝试打开聊天活动,其中包含发送消息的相应用户详细信息。这就是为什么我在Firebase函数中传递了发送消息的用户id。我在FCM中获得了正确的日志,但当我收到聊天通知并打开它时,它会打开活动,而没有任何用户名和消息。它将使用默认值打开活动的新实例。 消息负载: 我的清单如下: 我不知道我是否添加了一些不同的功能,比如LifeCycleEvent List

  • 我的两个系列是: 产品类别 产品 在$lookup中使用localfield和foreignfield,我可以获得预期的结果。 上面的工作正常,但我必须将$look kup中的管道模型用于另一个用例(用于添加$Geo近)。聚合查询如下所示。 这没有按预期工作,并返回大量条目。$match中的$exists没有得到正确执行。任何帮助,不胜感激。提前谢谢。

  • 问题内容: 我最近创建了一个在Windows上的boot2docker上运行的mongodb docker实例。 不幸的是,在尝试kitematic的过程中,我意外地从mongo容器中删除了该卷,并且无法再访问我的数据。 mongo实例似乎创建了一个新卷,而旧卷现在仍悬空(孤立)并且未安装在任何容器中。 有什么办法可以恢复吗? 问题答案: 感谢您的答复,它使我处于正确的轨道,我设法使用以下命令启动

  • 问题内容: 我正在运行一个Jenkins集群,其中在Master和Slave中,它们都作为Docker容器运行。 主机是在MacOS上运行的最新的boot2docker VM。 为了使Jenkins能够使用Docker执行部署,我将docker.sock和docker客户端从主机安装到Jenkins容器,如下所示: 在将卷装载到Jenkins容器中运行的Docker容器时,我遇到了问题。例如,如果

  • 我试图将我的源文件挂载到位于/var/dynamo的docker目录中。我希望能够在本地运行Docker,并在工作时使用我的本地文件。 使用run命令: Docker版本为1.9.1

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它