将文件从docker镜像复制到jenkins工作区

时间:2017-09-19 18:12:09

标签: docker jenkins-pipeline

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

例如,如果我在docker镜像的test.html目录中生成一个名为/app/的文件 - 如何将其复制到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

        }
    }

3 个答案:

答案 0 :(得分:4)

由于管道的docker插件不支持docker cp,因此有两种方法可以执行此操作。

解决方案1 ​​:启动实例时的卷映射-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
"""

答案 1 :(得分:1)

另一种方法是使用docker volume选项(-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'
        }
    }

答案 2 :(得分:0)

docker cp [containerID]:/ app / test.html / path / to_save / the / file