ipfs/go-ipfs にプルリクを投げたときのメモ
このプルリクを作るのにあたって色々大変だったのでメモ
GitHub Actions で複数の CPU アーキテクチャ向けに Docker Image を生成する方法
GitHub Actions で Docker Image を作るには公式から出てる https://github.com/docker/build-push-action を使うのが楽です
このアクションで複数の CPU アーキテクチャ向けに Image を作るには、公式がサンプルを用意してくれているので、それを見るとわかりやすいです
具体的には、docker/setup-qemu-action
を use
してから docker/build-push-action
に platforms: linux/amd64,linux/arm64
を指定するだけです
buildx で Docker Image を得るには load オプションが必要
元々の方針は
-
bin/push-docker-tags.sh
があるのでこれを流用したい - なので
docker/build-push-action
では Docker Hub には push せずに build だけ
docker/build-push-action
は Docker 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/
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-action
の tags
オプションに渡す方針にしました
ref: https://github.com/docker/build-push-action/blob/master/docs/advanced/push-multi-registries.md
複数行の標準出力を set-output
に渡すには、改行コードをエスケープする必要がありました。
GitHub Actionsのset-outputに複数行の標準出力を代入する場合は改行コードをエスケープしてあげる必要がある - Qiita では、1行目しか認識されないことが指摘されています。しかし自分が観測したのは、改行コードが空白文字に置換されてしまう、という問題でした。この問題に対してもエスケープするという方針で解決できました