读完本文大概需要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架构的镜像了
全文完