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上看到是这样的
构建起来也挺简单,需要安装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啦。
整个流程也很简单。
- checkout代码,如有需要也要准备好submodule
- 配置buildx、QEMU什么的
- 构建
- 推送到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
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上!
--本评论由Telegram Bot回复~❤️