【玩转腾讯云】在 CODING DevOps 持续集成中使用 Buildx 构建 Docker 镜像

现在容器化技术快速发展,Docker 镜像作为其基石,构建镜像的技术也在快速演进,去年 Docker 推出的 Buildki 技术试图去解决传统构建镜像过程中所存在的问题:

  • 多系统、架构的 Docker 镜像难以统一
  • 构建过程难以缓存

为解决以上问题,基于 buildkit 的 Docker CLI 插件 buildx 引入了 --platform --cache-from --cache-to 等参数,下面开始介绍如何在 CODING DevOps 持续集成中使用 Buildx 构建 Docker 镜像。

登录或者注册 CODING DevOps

  • https://cloud.tencent.com/product/coding

创建项目

登录之后,点击右上角项目(第三个图标)-> 创建项目 -> 模板选择 DevOps 项目

项目名称

自己填入一个名称

其他选项可以不填,点击完成创建

新建 Dockerfile

选择 代码仓库 -> 快速初始化仓库 -> 勾选 启用README.md文件初始化仓库 -> 点击 快速初始化按钮

点击 右上角三个点 -> 新建 -> 文件 -> 输入 Dockerfile -> 点击 创建

写入以下内容

FROM alpineRUN set -x \    && sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \    && apk add --no-cache curl git gccARG GIT_COMMIT="unknow"LABEL org.opencontainers.image.revision=$GIT_COMMITCMD ["sh","-c","uname","-a"]

点击提交

启用持续集成

选择 持续集成 -> 构建计划 -> 创建持续集成任务(新建构建计划配置) -> 输入 计划名称 -> 选择 使用静态配置的 Jenkinsfile -> 选择 简易模板 -> 点击 确定

coding_001.jpg

CODING DevOps 持续集成使用的是 Jenkis,通过 Jenkinsfile 进行配置。

点击 流程配置 -> 文本编辑器 -> 输入以下内容(搜素 fix me 替换为自己的内容)-> 点击 保存

pipeline {  agent any  environment {    // PLATFORM = "linux/amd64,linux/arm64,linux/arm/v7"    PLATFORM = "linux/amd64"    DOCKER_PASSWORD = "${env.DOCKER_PASSWORD}"    // fix me    DOCKER_USERNAME = "your_username"    DOCKER_CLI_EXPERIMENTAL = "enabled"    BUILDX_IMAGE= "dockerpracticesig/buildkit:master-tencent"    // fix me 这里使用腾讯云容器服务的 Docker 仓库 https://cloud.tencent.com/product/tke    DOCKER_REGISTRY= "ccr.ccs.tencentyun.com"    // fix me    DOCKER_REPO_NAMESPACE= "your_namespace"  }  stages {    stage('检出') {      steps {        checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],        userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])      }    }    stage('update docker to latest'){      steps {        sh "docker version"        sh "docker info"        sh "curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -"        sh "sudo add-apt-repository \"deb [arch=amd64] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu \$(lsb_release -cs) stable\""        sh "sudo apt update"        sh "sudo apt install docker-ce docker-ce-cli containerd.io -y"        sh "docker version"        sh "docker info"      }    }    stage('setup-buildx'){      steps {        sh "docker run --rm --privileged docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64 | true"        sh "docker buildx create --use --name mybuilder --driver-opt image=${BUILDX_IMAGE}"        sh "docker buildx ls"        sh "docker buildx inspect --bootstrap"      }    }    stage('登录仓库') {      steps {        sh "echo ${DOCKER_PASSWORD} | docker login -u ${DOCKER_USERNAME} --password-stdin ${DOCKER_REGISTRY}"      }    }    stage('构建镜像') {      steps {        sh "docker build -t ${DOCKER_REGISTRY}/${DOCKER_REPO_NAMESPACE}/demo --build-arg GIT_COMMIT ."        sh "docker push ${DOCKER_REGISTRY}/${DOCKER_REPO_NAMESPACE}/demo"      }    }    stage('构建镜像-buildx') {      steps {        sh "docker buildx build \            -t ${DOCKER_REGISTRY}/${DOCKER_REPO_NAMESPACE}/demo:buildx \            --platform linux/amd64 \            \$(if [ -f '/root/docker_build_cache/index.json' ];then \                  echo ' --cache-from=type=local,src=/root/docker_build_cache '; \               fi) \            --cache-to=type=local,dest=/root/docker_build_cache \            --build-arg GIT_COMMIT \            --push ."      }    }  }}
coding_002.jpg

新增 环境变量

环境变量可以存储 Docker Registry 密码等私密内容。

选择 变量与缓存 -> 流程环境变量 -> 添加环境变量

变量名称 DOCKER_PASSWORD,默认值填为你自己的 Docker Registry 密码,勾选 保密 ->点击确定

coding_003.jpg

设置 构建缓存

选择 变量与缓存 -> 缓存目录 -> 输入 /root/docker_build_cache -> 点击 保存修改

点击 返回 -> 点击 立即构建

查看结果

点击构建列表 -> 在构建过程中点击各个步骤即可查看到构建输出

可以对比 构建镜像 构建镜像-buildx 的执行时间,发现第一次构建两者所用时间相差不大,之后的每次构建 构建镜像-buildx 所用的时间较短(30s vs 8s)。

结语

免费版本的 CODING DevOps 提供了 200次/每周 30分钟/次 的配额。

由于国内访问 Docker Hub 较缓慢,以上用到的 Docker 仓库替换为了腾讯云容器服务提供的 Docker 仓库,创建 Buildx 实例的 Buildkit 镜像使用了替换镜像源为腾讯云的 dockerpracticesig/buildkit:master-tencent

可以发现使用 buildx 构建镜像具有诸多优点,而传统的 Docker 镜像仓库不提供 buildx 构建,那么使用 CODING DevOps 构建镜像并推送到仓库中是一个不错的选择。

注明:本文为星速云原创版权所有,禁止转载,一经发现将追究版权责任!

发表评论

登录后才能评论
问答社区 QQ客服
微信客服
微信客服
分享本页
返回顶部