专栏首页康怀帅的专栏【玩转腾讯云】在 CODING DevOps 持续集成中使用 Buildx 构建 Docker 镜像
原创

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

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

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

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

登录或者注册 CODING DevOps

创建项目

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

项目名称

自己填入一个名称

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

新建 Dockerfile

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

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

写入以下内容

FROM alpine

RUN set -x \
    && sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories \
    && apk add --no-cache curl git gcc

ARG GIT_COMMIT="unknow"

LABEL org.opencontainers.image.revision=$GIT_COMMIT

CMD ["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 构建镜像并推送到仓库中是一个不错的选择。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Travis CI 使用详解

    本文列举了使用 Travis CI 可能遇到的问题及其解决方法。 官方网站:https://travis-ci.org 官方文档:https://docs.tr...

    康怀帅
  • Docker 桌面版支持 kubernetes

    Docker for Mac v17.12 正式支持 k8s。 Docker for Windows v18.02-rc1 正式支持 k8s。 相关文章 Bet...

    康怀帅
  • Docker CE for Mac v17.12 正式支持 k8s

    视频:https://www.bilibili.com/video/av17307986/

    康怀帅
  • 使用 Dockerfile 定制镜像

    最近公司项目上线原因,一直加班。没有时间更新文章。隔壁部门需要我提供sdk的打包的支持,所以一直在学习docker。原文 ? 从刚才的 docker commi...

    若与
  • 数据处理基础(一)

    《实验设计与数据处理》是于 2009 年 10 月由化学工业出版社出版的图书,作者是张成军。本书通过典型实例介绍了常用实验设计及实验数据处理方法在科学研究和工业...

    润森
  • 详解PV、UV、VV、IP及其关系与计算

    PV即Page View,网站浏览量,指页面浏览的次数,用以衡量网站用户访问的网页数量。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。一...

    lyb-geek
  • LeetCode 958. 二叉树的完全性检验(层序遍历)

    若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h...

    Michael阿明
  • 八大关于业余无线电台的树莓派应用

    FHYC
  • 人类白细胞抗原-HLA简介

    HLA 全称human leukocyte antigen, 表示人类白细胞抗原,是编码主要组织相容性复合体(MHC)的基因,位于6p21.31的区域,包含了一...

    生信修炼手册
  • 七夕,如何用乐享发起一场花式虐狗?

    一年一度的七(nue)夕(gou)节又要到了,把乐享玩儿的666要起飞的鹅厂(腾讯的别称)员工,自然不会错过这场期待已久的年度虐狗盛宴,让我们一起来看看作为一只...

    腾讯乐享

扫码关注云+社区

领取腾讯云代金券