ことの始まり
僕は役職パネルっていうDiscord BOTを運用しているのだが、開発パートナーがDockerを勉強したいとのことで、Dockerを導入することにした。
しかし、通常のPCのCPUアーキテクチャはamd64で、ラズベリーパイはarm64というものだ。アーキテクチャが違うと、イメージの共有はできない。しかしラズベリーパイでビルドはあまりしたくない。
そこで、「docker buildx」でマルチプラットフォーム向けにビルドできるので使ってみた。
下準備(最初だけでOK)
qemuの準備をする
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
最初とfailed to load LLB: runtime execution on platform linux/arm64 not supported
とか error: failed to solve: rpc error: code = Unknown desc = executor failed running [/dev/.buildkit_qemu_emulator /bin/sh -c python -m venv /venv]: exit code: 1
みたいなエラーが出てきたら実行する。
ビルダーインスンタンスを準備する
name引数は適当でもOK
docker buildx create --name builder --use
ビルド
docker buildx build .
みたいな感じに、いつもビルドするときと同じようにビルドすればOK。
プラットフォームを指定したいときは
docker buildx build --platform=linux/amd64 --load .
みたいな感じにプラットフォームを指定する。(複数指定に関しては後述)
マルチプラットフォーム向けのビルド
プラットフォームを複数指定したい場合は、以下のようにすればよいのだが
これだけだとイメージが保存できずにエラーを吐く!
docker buildx build --platform=linux/amd64,linux/arm64 --load .
じゃあどうするのかというと、DockerHubなどのレジストリにプッシュしてあげれば良い。
プッシュはこんな感じにする
#imagetagは、pushしたいイメージのタグに置き換える。
docker buildx build --platform=linux/amd64,linux/arm64 --push --tag imagetag .
参考URL