前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过Github Actions自动化Docker镜像打包和上传

通过Github Actions自动化Docker镜像打包和上传

原创
作者头像
用户6404053
发布2023-05-17 00:55:02
2.7K0
发布2023-05-17 00:55:02
举报
文章被收录于专栏:Catorory

读完本文大概需要5分钟

可以了解到docker构建多架构镜像相关的信息和Github Actions的使用

Github Actions解决什么问题

Docker是个很好用的东西,很多项目直接拉个镜像下来就可以跑了,不用再像之前一样卡在各种环境问题里出不来。非常方便,但是有个问题,如果代码更新比较频繁的话,怎么能让我的镜像总是保持最新呢,手动去更新是个很费力的事情。今天介绍的Github Actions就是解决这个问题的利器。

怎么解决

贴一段官方的介绍,GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。想了解更多细节可以点击传送门

简单的说就是可以定义一个工作流,然后在满足一些条件的时候运行一些任务(job)。比如下面定义了一个构建Docker镜像的任务,在dev分支、v2*分支和v*tag的代码有push操作的时候进行新镜像的构建

代码语言:javascript
复制
name: "Build Docker Image"

on:
  push:
    branches:
      - dev
      - v2*
    tags:
      - v*

一步一步实现打包镜像并上传dockerhub

项目:https://github.com/apache/incubator-streampark

问题1

我想用docker把上面的项目在我的mac电脑上跑起来,不幸的是官方镜像只有linux/amd64的,只能自己动手了

简单搜了下,docker本身对多架构镜像的构建支持非常好,基本上配置一下就行了,在简单折腾之后打包成功,然后有了新问题

问题2

怎么把我构建的镜像分享给其他人,答案是上传dockerhub,但是怎么自动化呢,主角登场了,用github Actions

怎么做

从0开始学当然是没问题的,但是有点慢,我们先看看项目里是怎么用的。

简单分析一下,

1.定义了镜像构建的触发时机,指定分支push的时候和每天的0:10分

2.有一个if判断

3.构建的环境是ubuntu-latest的基础镜像,然后是一些项目代码编译打包配置

4.配置了Docker Hub的登录信息、空间信息

5.Docker镜像构建和推送

代码语言:yaml
复制
name: "Build Docker Image"

on:
  schedule:
    - cron: '0 10 * * *'
  push:
    branches:
      - dev
      - release-*
    tags:
      - v*

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build_image:
    runs-on: ubuntu-latest
    if: ${{ github.repository == 'apache/incubator-streampark' }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Setup Java and Scala
        uses: olafurpg/setup-scala@v13
        with:
          java-version: adopt@1.8

      - uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build project release package
        run: |
          ./mvnw clean install -DskipTests -Pscala-2.12,shaded,dist,webapp

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: apache/streampark
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=tag
            type=ref,event=branch

      - name: Build and push streampark
        uses: docker/build-push-action@v3
        with:
          context: .
          file: deploy/docker/Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

流程搞清楚了,下面开始实操

多架构镜像打包

只需要增加几行配置就行,像下面这样

1.打包环境需要QEMU,一种虚拟化技术

2.设置Buildx

代码语言:javascript
复制
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

3.增加架构配置

代码语言:javascript
复制
platforms: linux/amd64,linux/arm64/v8

arm64有v8也有其他版本,不过差异比较小,可以先忽略

推送Docker Hub

1.首先当然是申请账号,然后在Account setting、security下面有个AccessToken,生成一个

2.然后在github项目的setting=>security下,找到secrets and variables

3.配置上DOCKERHUB_USER和DOCKERHUB_TOKEN

4.将dockerhub的image namespace改为自己的,因为官方的账号我们没有权限推送,只能推自己账号下的空间

修改触发配置

新增一个分支v2.1.0,push的时候触发

代码语言:javascript
复制
on:
  push:
    branches:
      - v2*

修改完成后的配置

代码语言:javascript
复制
name: "Build Docker Image"

on:
  push:
    branches:
      - v2*
    tags:
      - v*

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build_image:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Setup Java and Scala
        uses: olafurpg/setup-scala@v13
        with:
          java-version: adopt@1.8

      - uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build project release package
        run: |
          ./mvnw clean install -DskipTests -Pshaded,dist,webapp

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: delik8shub/streampark
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=tag
            type=ref,event=branch

      - name: Build and push streampark
        uses: docker/build-push-action@v3
        with:
          context: .
          file: deploy/docker/Dockerfile
          platforms: linux/amd64,linux/arm64/v8
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

触发构建

1.把上面新建的v2.1.0分支先push到github

2.然后随便增加个空格啥的,再push

去actions里看,开始编译了

推送DockerHub

如果一切正常的话就能得到arm架构的镜像了

全文完

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Github Actions解决什么问题
  • 怎么解决
  • 一步一步实现打包镜像并上传dockerhub
    • 问题1
      • 问题2
        • 怎么做
        • 多架构镜像打包
        • 推送Docker Hub
        • 修改触发配置
        • 触发构建
        • 推送DockerHub
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档