You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:15:04