Open4

ipfs/go-ipfs にプルリクを投げたときのメモ

odanodan

GitHub Actions で複数の CPU アーキテクチャ向けに Docker Image を生成する方法

GitHub Actions で Docker Image を作るには公式から出てる https://github.com/docker/build-push-action を使うのが楽です

このアクションで複数の CPU アーキテクチャ向けに Image を作るには、公式がサンプルを用意してくれているので、それを見るとわかりやすいです

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

具体的には、docker/setup-qemu-actionuse してから docker/build-push-actionplatforms: linux/amd64,linux/arm64 を指定するだけです

odanodan

buildx で Docker Image を得るには load オプションが必要

元々の方針は

  • bin/push-docker-tags.sh があるのでこれを流用したい
  • なので docker/build-push-action では Docker Hub には push せずに build だけ

docker/build-push-actionDocker Buildx | Docker Documentation のラッパー的なアクションです
--load を指定すると docker build したときと同様に Docker Image を得ることができます

出力先を指定するオプションは--outputですが、--loadオプションは--output type=dockerと指定したことと同じ意味になります。
これは「生成したイメージをローカルDockerへ出力する」という意味です。
https://dev.classmethod.jp/articles/docker-multi-architecture-image-build/

このオプションを使ってローカルに出力した Docker Image を bin/push-docker-tags.sh で Docker Hub に push する予定でした。しかし platforms オプションと load オプションは基本的に併用できないものでした。

実は、ビルド実行時に--loadオプションを指定してローカルDockerへイメージを出力しようとした場合、ビルド環境と異なるプラットフォームのDockerイメージは出力することができない という制約があります。
https://dev.classmethod.jp/articles/docker-multi-architecture-image-build/

odanodan

GitHub Actions の set-output で複数行の出力を扱う方法

bin/push-docker-tags.sh は使えないことがわかったので、docker/build-push-action で Docker Hub への push までやる必要があります

bin/push-docker-tags.sh の中身を見るとわかるとおり、現在のブランチに応じて Docker Image のタグを色々切り替えています
なので、タグを echo するだけの bin/get-docker-tags.sh を作成して、その標準出力を docker/build-push-actiontags オプションに渡す方針にしました

ref: https://github.com/docker/build-push-action/blob/master/docs/advanced/push-multi-registries.md

複数行の標準出力を set-output に渡すには、改行コードをエスケープする必要がありました。
GitHub Actionsのset-outputに複数行の標準出力を代入する場合は改行コードをエスケープしてあげる必要がある - Qiita では、1行目しか認識されないことが指摘されています。しかし自分が観測したのは、改行コードが空白文字に置換されてしまう、という問題でした。この問題に対してもエスケープするという方針で解決できました