保存 Dockerfile 镜像用于下次集成

背景介绍

持续集成使用 Dockerfile 作为构建环境很方便,但每次都要先进行 docker build,很慢。

解决方案:把构建的 Docker 镜像保存到仓库,下次直接拉取。

Jenkinsfile

// 创建 CODING Docker 制品库,获取用户名、密码和仓库地址
sh "docker login -u $DOCKER_USER -p $DOCKER_PASSWORD my-team-docker.pkg.coding.net"

// 使用 Dockerfile 的 md5 做 tag
md5 = sh(script: "md5sum Dockerfile | awk '{print \$1}'", returnStdout: true).trim()
imageFullName = "my-team-docker.pkg.coding.net/my-project/my-repo/my-app:dev-${md5}"

// 检查镜像是否已存在远端仓库
dockerNotExists = sh(script: "DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $imageFullName > /dev/null", returnStatus: true)
def testImage = null
if (dockerNotExists) {
    testImage = docker.build("$imageFullName", "--build-arg APP_ENV=testing ./")
    sh "docker push $imageFullName"
} else {
    testImage = docker.image(imageFullName)
}

// 使用镜像进行自动化测试
testImage.inside("-e 'APP_ENV=testing'") {
    stage('test') {
        echo 'testing...'
        sh 'ls'
        echo 'test done.'
    }
}

代码解释:在 shell 中执行下列命令,通过返回值可以判断「镜像是否已存在」。

$ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect ecoding/foo:bar
no such manifest
$ echo $?
1

截图

CODING CI(Jenkins 云服务)

可以看出:第 1 次构建很慢,因为需要生成镜像,而第 2 次很快。

参考资料

上一篇在持续集成中使用 Docker
文档是否对您有用?
感谢反馈有用
感谢反馈没用