使用Docker Agent时如何让Jenkins阶段结束后容器持续运行?
解决Jenkins流水线阶段结束后Docker容器被自动删除的问题
你当前的写法是在单个stage里定义docker agent,Jenkins的默认行为就是在该stage执行完成后自动停止并删除对应的容器。要让容器保留供后续阶段使用,有两种常用方案:
方案一:全局复用同一个Docker容器
把docker agent定义在整个pipeline的最外层,这样所有stage都会在同一个容器内执行,容器只会在整个流水线结束后才被清理。
示例代码:
pipeline { agent { docker { label "${RUNNING_NODE}" image "${IMAGE}" reuseNode true } } stages { stage("Set up first image") { steps { echo "This is treasure!" } } stage("Second stage using same container") { steps { echo "Running in the same container as first stage!" // 这里可以执行需要复用容器环境的操作 } } } }
方案二:手动管理容器生命周期
如果需要不同阶段灵活控制容器,也可以手动启动容器,记录容器ID,后续阶段通过docker exec执行命令,最后在流水线结束时手动清理容器。
示例代码:
pipeline { agent any environment { CONTAINER_ID = "" } stages { stage("Start Docker container") { steps { script { // 启动容器并后台运行 CONTAINER_ID = sh(script: "docker run -d --name my-shared-container ${IMAGE}", returnStdout: true).trim() echo "Started container with ID: ${CONTAINER_ID}" } } } stage("Set up first image") { steps { script { // 在容器内执行命令 sh "docker exec ${CONTAINER_ID} echo 'This is treasure!'" // 其他需要在容器内执行的操作都用docker exec } } } stage("Second stage using same container") { steps { script { sh "docker exec ${CONTAINER_ID} echo 'Using the same container again!'" } } } } post { always { // 不管流水线成功失败,最后都清理容器 sh "docker stop ${CONTAINER_ID} && docker rm ${CONTAINER_ID}" } } }
注意事项
- 方案一的优势是简单,Jenkins自动管理容器,适合所有阶段都依赖同一环境的场景。
- 方案二更灵活,适合需要在不同阶段对容器做特殊配置的场景,但需要自己处理容器的启动、连接和清理,避免残留僵尸容器。
内容的提问来源于stack exchange,提问作者himneh
相关产品推荐
相关产品推荐

