登录
  • 人们都希望被别人需要 却往往事与愿违
  • 大多数人宁愿死去, 也不愿思考。 -- 事实上他们也确实到死都没有思考@罗素 (哲学家 数学家)

使用GitHub Actions构建Multi-arch Docker image

编程 Benny小土豆 2886次浏览 2688字 2个评论
文章目录[显示]
这篇文章在 2021年07月07日08:33:12 更新了哦~

参考配置,直接把这个文件丢到你的repository下,就可以用啦

https://github.com/BennyThink/ActionTest/blob/master/.github/workflows/builder.yaml


这个世界对arm是如此的不友好:

standard_init_linux.go:178: exec user process caused "exec format error"

大部分docker image都是为了amd64构建的,那么这些image无法在arm64上运行,如果运行就会出现如上报错。

有一种构建方式,叫做 Multi-arch,在docker hub上看到是这样的

使用GitHub Actions构建Multi-arch Docker image

构建起来也挺简单,需要安装buildx,Linux需要额外开启binfmt_misc,创建新的构建器,然后buildx开始构建,整体命令大概如下:

# 开启buildx
export DOCKER_CLI_EXPERIMENTAL=enabled

# 验证buildx
docker buildx version

# 如果上述命令报错,未安装 buildx,需要手动安装一下
mkdir -p ~/.docker/cli-plugins
wget -O ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64
chmod a+x ~/.docker/cli-plugins/docker-buildx

# 开启 binfmt_misc, Linux only
docker run --rm --privileged docker/binfmt:66f9012c56a8316f9244ffd7622d7c21c1f6f28d

# 验证qemu
ls -al /proc/sys/fs/binfmt_misc/
cat /proc/sys/fs/binfmt_misc/qemu-aarch64

# 创建新的构建器
docker buildx create --use --name mybuilder

# 构建
docker buildx build -t bennythink/test --platform=linux/arm,linux/arm64,linux/amd64 . --push

当然了不能每次都这样手动构建,可是Docker Hub的自动构建不仅要停了,还不能这么构建。那么剩下的比较优雅的解决方案就是 GitHub Actions啦。

整个流程也很简单。

  1. checkout代码,如有需要也要准备好submodule
  2. 配置buildx、QEMU什么的
  3. 构建
  4. 推送到Docker Hub

build-push-action文档已经写的很好啦,我简单复制粘贴一下

checkout

使用 actions/checkout@v2

- name: Checkout
  uses: actions/checkout@v2
  with:
    submodules: true

如果没有submodule的话,整个step可以删掉,build-push-action会自动checkout

配置buildx

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

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

然后登录到Docker Hub,需要在repository – settings中设置secrets

- name: Login to DockerHub
  uses: docker/login-action@v1
  with:
    username: ${{ secrets.DOCKERHUB_USERNAME }}
    password: ${{ secrets.DOCKERHUB_TOKEN }}

构建推送

- name: Build and push
  uses: docker/build-push-action@v2
  with:
    context: .
    platforms: linux/amd64,linux/arm64
    push: true
    tags: bennythink/yyetsbot:latest

这样一波操作之后,每次push之后,GitHub Actions就会自动运行,然后Docker Hub上就可以有amd64/arm64的image啦。

几乎是0排队,再也不用“构建100秒,排队90秒”啦。

使用cache

GitHub Actions似乎也能利用build cache,这样可以大幅增加构建速度

参考这里可以配置一下

https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#github-cache

获取secret 

使用如下形式就可以获取到secrets中配置的值

${{ secrets.SENTRY_ORG }}

可以配置环境变量中,在build时可以访问。同时也可以在某一个step中的run手动运行任意命令,来达到build hooks的效果。比如:

- name: Run hooks
  env:
    SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
  run: echo $SENTRY_ORG >> /tmp/1.txty
要记得区分构建时环境变量、运行时环境变量还有build-arg哦。

Yarn - There appears to be trouble with your network connection. Retrying

我在构建时经常会出这种错,毕竟是在QEMU中跑的node,所以会很慢。一个可行的解决方案就是加长超时时间

yarn --network-timeout 100000

参考资料

build-push-action https://github.com/docker/build-push-action

YYeTsBot workflow https://github.com/tgbot-collection/YYeTsBot/blob/master/.github/workflows/builder.yaml

如何构建多架构 Docker 镜像? https://www.infoq.cn/article/v9qj0fjj6hsgyq0lphxg

🤨等我有空的,就把我自己的经常维护的项目都docker image都弄到GitHub Actions上!

 

 


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/github-actions-docker-image.html
喜欢 (40)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论(代码和日志请使用Pastebin或Gist)
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(2)个小伙伴在吐槽
  1. 层层套娃
    醉渔2021-07-04 21:42 回复
    • 套娃刺激!
      --本评论由Telegram Bot回复~❤️
      Benny小土豆2021-07-04 22:06 回复