【问题标题】:Copy file from docker image to jenkins workspace将文件从 docker 镜像复制到 jenkins 工作区
【发布时间】:2017-09-19 18:12:08
【问题描述】:

我有一个使用 dockerfile 的 jenkinsfile - 我对如何将文件从 docker 映像复制到 jenkins 工作区感兴趣。具体来说 - 我正在生成一份关于我希望由 jenkins 工作发布的 docker 图像的 HTML 报告。

例如,如果我在 docker 映像的 /app/ 目录中生成了一个名为 test.html 的文件 - 如何将其复制到 jenkins 工作区以便我可以发布它。

下面的示例Jenkinsfile

node ('ondemand') {
    try {
        stage "build"
        checkout scm
        def customImage = docker.build("docker-image:${env.BUILD_ID}", "-f ./docker-image/Dockerfile .")

        stage "test copying files"
        customImage.inside('-u root') {
            sh 'touch /app/test.html && ls' // can see that test.html is generated

        }
    }

【问题讨论】:

  • Jenkins 将使用inside 处理容器的创建和关闭。一种简单的方法是将文件从/app 复制到您的WORKSPACE 的本地位置,例如sh "mkdir ${env.WORKSPACE}/jenkinsOut && cp -r /app/ ${env.WORKSPACE}/jenkinsOut",因为工作空间在容器和主机之间共享。

标签: docker jenkins-pipeline


【解决方案1】:

由于管道的docker插件不支持docker cp,有两种方法可以做到。

解决方案一:启动实例时的卷映射-v

customImage.inside('-v $WORKSPACE:/output -u root') {
    sh 'touch /app/test.html && ls' // can see that test.html is generated
}
archiveArtifacts artifacts: '*.html'

查看完整的Jenkinsfile

解决方案 2: 在 shell 中使用传统的 docker 命令(未验证)

sh """
docker run --name sample -d -u root docker-image:${env.BUILD_ID} 'touch /app/test.html'
docker cp sample:/app/test.html .
docker rm -f sample
"""

【讨论】:

  • 我想知道人们是否投票支持解决方案一……或解决方案二,或解决方案二
【解决方案2】:

另一种方法是使用 docker 卷选项 (-v /path/build:/app/build) 将工作区文件夹绑定到容器

例子:

node ('ondemand') {
    try {
        stage "build"
        checkout scm
        def customImage = docker.build("docker-image:${env.BUILD_ID}", "-f ./docker-image/Dockerfile .")

        stage "test copying files"
        customImage.inside('-u root -v /path/build:/app/build') {
            sh 'touch /app/build/test.html'
        }
    }

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2015-03-22
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多