if 在 Jenkinsfile 上检查 docker 图像的条件

if condition for checking docker image on Jenkinsfile

我对 Jenkins 声明式管道还很陌生。在 Jenkinsfile 中,我想检查一个 具体 docker 图片是否已经在机器上。如果图像已经存在,那么它只是删除旧的然后构建新的,如果不是那么它只是构建新的。我怎样才能通过声明式管道达到这个目标?

如果你愿意帮忙,非常感谢

如果您已经在本地拥有映像,那么无论是构建映像还是从注册表中提取映像都非常便宜。如果您正在构建图像,Docker 的 layer caching 意味着 Docker 将扫描 Docker 文件并快速断定它已经有了最终图像;如果您从注册表中提取它,Docker 将联系注册表,获取层列表(小),并确定它已经拥有所有层。

这意味着可以无条件地 build/pull 您 CI 系统中的图像。如果没有工作要做,很快就会发生。

(相反,请注意,某些 Docker 映像实际上会定期更新;例如,ubuntu 基本映像每周重新发布一次,每个月都会更新安全补丁。所以有一些受益于 总是 在您的 CI 系统中拉取基本映像,因此您一定会获得这些更新。)

您可以使用 sh "docker rmi -f <ImageID>" 命令删除图像。
要找到 ImageID,您可以使用 docker 的 -qf 选项列出图像 ID。
参考范例如下:

stage('Remove old Image') {
            steps {
                script { 
                    def imageName = "<Your image Name>"
                    env.imageName = "${imageName}"
                    def oldImageID = sh( 
                                            script: 'docker images -qf reference=${imageName}:${imageTag}',
                                            returnStdout: true
                                        )

                    echo "Image Name: " + "${imageName}"
                    echo "Old Image: ${oldImageID}"

                    if ( "${oldImageID}" != '' ) {
                        echo "Deleting image id: ${oldImageID}..."
                         sh "docker rmi -f ${oldImageID}"
                    } else {
                        echo "No image to delete..."
                        } 
                    }  
                }
            }

有关 docker 图片选项的信息,请访问:https://docs.docker.com/engine/reference/commandline/images/