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

如何清理Jenkins Agent所使用的Docker镜像?

解决Jenkins Docker Agent镜像清理冲突问题

问题原因

Jenkins的Docker Agent默认以后台模式(-d)启动容器,尽管你指定了--rm参数,但容器会在Agent任务完全结束后才自动销毁。而post {success}阶段在整个Pipeline执行完毕后触发,此时关联的Docker容器可能尚未被清理,导致镜像被容器占用,无法正常删除。

解决方案

方案1:先清理关联容器再删除镜像

在post {success}块中,先定位并清理使用目标镜像的容器,再执行镜像删除操作:

post {
    success {
        sh '''
            # 查找使用my_tag镜像的运行中容器
            CONTAINER_ID=$(docker ps -q --filter "ancestor=my_tag")
            # 若存在则停止并删除容器
            if [ -n "$CONTAINER_ID" ]; then
                docker stop $CONTAINER_ID
                docker rm $CONTAINER_ID
            fi
            # 删除镜像
            docker rmi my_tag
        '''
        successNotify()
    }
    failure {
        failureNotify()
    }
}

注意:此方法会清理所有使用该镜像的容器,仅适用于该镜像为Pipeline专属的场景。

方案2:使用reuseNode参数让容器随Stage结束销毁

修改Docker Agent配置,添加reuseNode true,让容器在当前节点启动,且Stage执行完毕后立即销毁:

stage('Run Stuff In Docker'){
    agent {
        docker {
            image "my_tag"
            args '--rm -v /some_location:/some_location:rw'
            reuseNode true
        }
    }
    stages{
        // 容器内执行的任务
    }
}

这是Jenkins原生的优雅解决方案,容器会在Stage结束后自动清理,到post阶段时镜像已无占用,可直接删除。

方案3:用Docker自动清理未被使用的镜像

使用docker image prune命令,仅删除未被任何容器引用的目标镜像:

post {
    success {
        sh "docker image prune -f --filter='reference=my_tag'"
        successNotify()
    }
    failure {
        failureNotify()
    }
}

-f参数强制删除,--filter确保只清理指定标签的镜像,无需手动处理容器,适合批量清理场景。

内容的提问来源于stack exchange,提问作者Rob Allsopp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:00:04