繁体   English   中英

如何在脚本化的 Jenkinsfile 管道中构建和运行 Docker 映像?

[英]How to build and run a Docker image in a scripted Jenkinsfile pipeline?

我正在尝试从脚本化的 Jenkinsfile 在特定构建节点上构建和运行 docker 映像。 我宁愿避免切换到声明式语法。 我的代码与文档中的示例非常接近。 图像按预期构建。 但是运行容器失败詹金斯抱怨节点的物理机器没有在容器内运行,并且来自我希望在容器内运行的最内层块的 echo 和 make 命令没有执行并且不会出现在日志中。

据我了解,Jenkins 认为容器本身就是构建节点,并且不允许嵌套节点语句。 同时需要一个节点来构建和运行 Docker 镜像。

我缺少什么来构建和运行图像? 由于我对 Jenkins 和 Docker 都很陌生,因此我很感激任何提示或建议。

编码:

node('BuildMachine1')
{
    withEnv(envList)
    {
        dir("/some/path")
        {
            docker.build("build-image:${env.BUILD_ID}", "-f ${env.WORKSPACE}/build/Dockerfile .").inside
            {
                echo "Echo from Docker"
                sh script: 'make'
            }
        }
    }
}

日志:

Successfully built 8c57cad188ed
Successfully tagged build-image:79
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker inspect -f . build-image:79
.
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] withDockerContainer
BuildMachine1 does not seem to be running inside a container
$ docker run -t -d -u 1004:1005 -w /data/Jenkins_Node/workspace/myFeature/buildaarch64Release -v /data/Jenkins_Node/workspace/myFeature/buildaarch64Release:/data/Jenkins_Node/workspace/myFeature/buildaarch64Release:rw,z -v /data/Jenkins_Node/workspace/myFeature/buildaarch64Release@tmp:/data/Jenkins_Node/workspace/myFeature/buildaarch64Release@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 ******** -e ******** build-image:87 cat
$ docker top 2242078968bc1ee5ddfd08c73a2e1551eda36c2595f0e4c9fb6e9b3b0af15b8b -eo pid,comm
[Pipeline] // withDockerContainer

看起来容器的入口点的配置方式适用于终端中的手动使用,但不适用于 Jenkins 管道内。 它被设置为ENTRYPOINT ["/usr/bin/env", "bash"]将其更改为ENTRYPOINT [ "/bin/bash", "-l", "-c" ]之后,Jenkinsfile 使用了生成的容器如预期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM