1. 授权认证
  2. 获取用户个人信息
  3. 项目协同
  4. 代码托管
  5. 持续集成
  6. 制品仓库
  7. 测试管理
  1. 项目协同
  2. 代码仓库
  3. DevOps 实践之旅
  4. 一分钟开始持续集成之旅
  5. 持续部署
  6. 制品库

保存 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
最近更新
感谢反馈有用
感谢反馈没用