簡體   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