Docker-Workflow-Plugin容器清理失败,能否自定义清理逻辑?
调整Docker Pipeline插件的容器清理流程,自定义处理容器删除
当然可以调整!Docker Pipeline(docker-workflow-plugin)的inside步骤提供了参数让你跳过自动清理,转而在流水线代码里自行处理容器删除,包括用重试块来提高清理成功率。下面是具体的实现方案:
1. 禁用插件的自动容器清理
默认情况下,docker.image().inside()会在代码块执行完成后自动调用docker rm删除容器。你可以通过设置remove: false参数来关闭这个自动行为,让容器保留下来:
docker.image(selectedNodeLabel).inside(remove: false) { build_kernel_module(version, distro, test, type) }
如果你的inside需要额外的容器运行参数(比如用户权限),可以把参数和配置放在一起:
docker.image(selectedNodeLabel).inside('-u root', remove: false) { build_kernel_module(version, distro, test, type) }
2. 在重试块中手动处理容器删除
禁用自动清理后,你需要自己负责删除容器。关键是要先获取到容器ID——在inside代码块执行时,插件会把容器ID注入到环境变量DOCKER_CONTAINER_ID中,你可以保存这个ID,然后在finally块里用retry逻辑来尝试删除:
def targetContainerId = null try { docker.image(selectedNodeLabel).inside('-u root', remove: false) { // 保存当前运行的容器ID targetContainerId = env.DOCKER_CONTAINER_ID echo "Running build in container: ${targetContainerId}" build_kernel_module(version, distro, test, type) } } finally { // 无论代码块执行成功还是失败,都尝试删除容器 if (targetContainerId) { echo "Attempting to remove container: ${targetContainerId}" // 重试3次,避免临时的Docker API问题导致删除失败 retry(3) { sh "docker rm -f ${targetContainerId}" echo "Successfully removed container: ${targetContainerId}" } } }
关键说明
- 为什么这么做?原错误是插件自动清理时调用
docker rm失败,可能是临时的Docker daemon连接问题、容器状态异常(比如已经被意外停止但还没清理)、或者节点权限问题。通过手动控制清理逻辑,你可以加入重试、日志输出等,提高清理的可靠性。 - 权限注意:确保运行Jenkins代理的用户有执行
docker rm的权限——通常是把用户加入docker用户组,避免使用sudo(会带来额外的权限风险)。 - 容器状态:即使容器在
build_kernel_module执行过程中崩溃,DOCKER_CONTAINER_ID依然有效,因为容器停止后ID不会立即消失,直到被删除。
内容的提问来源于stack exchange,提问作者Peter Kahn
相关产品推荐
相关产品推荐

