「最新のMacからラズパイ4、それに従来のamd64まで
マルチに対応したコンテナが作れる docker buildx
」
なにそれすごい!
❯ docker buildx
docker: 'buildx' is not a docker command.
See 'docker --help'
おおう...
どうも2021/10時点で、「Windows/Mac版 Docker Desktop」なら設定一箇所変えるだけで使えるようですが、
Linux版はプロプリなバイナリを含む関係で apt 一発では入らないのでした。
てわけで tl&dr; なアナタに、一撃設定スクリプトを書いてみました。
Dockerデーモンの再起動までやっちゃいます。
/etc/docker/daemon.json
を弄るので、もし何か設定をされている場合は上書きされてしまうのでご注意下さい!!
#!/usr/bin/env bash
# 必要なパッケージ
sudo apt-get install -y qemu qemu-user-static binfmt-support debootstrap
# linuxではbuildxランタイムの手動インストールが必要
# 参考: https://docs.docker.com/buildx/working-with-buildx/
mkdir -p ~/.docker/cli-plugins/
cd ~/.docker/cli-plugins/ || exit
wget https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
mv buildx-v0.6.3.linux-amd64 docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup$(date '+%Y%m%d_%H%M%S')
echo '{"experimental":true}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
数分で終わります。(複数アーキテクチャが並列ビルドされてちょっと面白いです)
終わったら docker buildx version
が実行出来ることを確認します:
❯ docker buildx version
github.com/docker/buildx v0.6.3-docker 266c0eac611d64fcc0c72d80206aa364e826758d
お、何か動いてる!
上記がOKでしたら、こんな感じで従来の
docker build
だった部分をそのまま docker buildx build
+ オプション指定に置き換えて実行すれば、
だいたい一発で動いちゃうと思います。こりゃすごい
# まずビルダーを作成
docker buildx create --name armBuilder
docker buildx use armBuilder
# multi arch ビルド & プッシュ
docker buildx build . \
--platform linux/amd64,linux/arm64/v8 \
--output=type=image,push=true \
--tag taiyodayo/my_app
エラー無く実行できたら多分成功です!おめでとうございます!
ubuntuやalpineベースのイメージは結構な割合でそのままビルドできちゃう印象です。
こりゃ Apple Silicon が捗ります。
さてここからは確認だけですので忙しい方は読み飛ばしてOKです!
まず docker hub から イメージがマルチアーキになっているか確認します:
うへーいしっかりarm64/amd64が選べるようになってます!
コマンドからも確認できます。
docker image inspect taiyodayo/my_app
するとJSONでイメージのマニフェストが確認できます
# M1 MacBook Air から docker pull taiyodayo/my_app した場合
"Architecture": "arm64",
"Os": "linux",
"Size": 611768789,
"VirtualSize": 611768789,
# amd64のUbuntuマシンで docker pull taiyodayo/my_app した場合
"Architecture": "amd64",
"Os": "linux",
"Size": 658537637,
"VirtualSize": 658537637,
しっかり各アーキテクチャごとにビルドされてますね!
なにげに push も一緒に出来たり buildx
、色々試しがいがありそうです。
こりゃ楽しい!