如何在Jenkins中仅当指定Docker容器和网络存在时执行删除
Jenkins 流水线指定Docker资源清理实现方案
清理命令编写(避免无差别删除&不存在时报错)
针对你的两个需求,可通过Docker自带的过滤命令先判断资源是否存在,存在时才执行删除操作,命令如下:
# 清理指定容器:仅存在mybackend、mybackend2时停止删除 for container_name in mybackend mybackend2; do if [ -n "$(docker ps -a --filter "name=^/${container_name}$" --format "{{.Names}}")" ]; then docker stop ${container_name} docker rm ${container_name} fi done # 清理指定网络:仅存在my-net时删除 if [ -n "$(docker network ls --filter "name=^my-net$" --format "{{.Name}}")" ]; then docker network rm my-net fi
命令说明:
- 过滤条件用
^/名称$做精确匹配,避免匹配到名称相似的容器/网络 - 仅当判断资源存在时才执行删除操作,不会触发资源不存在的报错
- 支持同时清理多个指定容器,新增容器名只需修改for循环的列表即可
流水线配置方案
方案1:所有阶段前执行清理(核心需求适配)
将清理步骤作为第一个Stage放在所有业务执行阶段之前,每次流水线启动时先清理残留资源,示例声明式流水线配置如下:
pipeline { agent any stages { stage('前置清理Docker资源') { steps { sh ''' for container_name in mybackend mybackend2; do if [ -n "$(docker ps -a --filter "name=^/${container_name}$" --format "{{.Names}}")" ]; then docker stop ${container_name} docker rm ${container_name} fi done if [ -n "$(docker network ls --filter "name=^my-net$" --format "{{.Name}}")" ]; then docker network rm my-net fi ''' } } // 下方放置原有业务执行阶段 stage('构建镜像') { steps { echo '构建镜像逻辑' } } stage('部署服务') { steps { echo '部署服务逻辑' } } } }
方案2:流水线执行完成后自动清理(适配后置清理需求,避免中间失败无法触发)
如果需要在流水线跑完之后清理资源,无论流水线执行成功、失败还是被取消都要触发,可使用Jenkins流水线的post always语法,配置示例:
pipeline { agent any stages { // 下方放置原有业务执行阶段 stage('构建镜像') { steps { echo '构建镜像逻辑' } } stage('部署服务') { steps { echo '部署服务逻辑' } } } post { always { // 无论流水线执行状态如何,都会执行这里的清理逻辑 sh ''' for container_name in mybackend mybackend2; do if [ -n "$(docker ps -a --filter "name=^/${container_name}$" --format "{{.Names}}")" ]; then docker stop ${container_name} docker rm ${container_name} fi done if [ -n "$(docker network ls --filter "name=^my-net$" --format "{{.Name}}")" ]; then docker network rm my-net fi ''' } } }
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

