M1 Mac が発売されてから 2 年が経とうとしており,普段の開発で M1 Mac をメインにしている方も多くなってきたかと思います.さらに最近では M2 も発売され, Apple Silicon はこれからも普及していこうとしています.開発していて M1 Mac ならではの問題に遭遇することも減ってきました.エコシステムが M1 (というより aarch64 アーキテクチャ) に対応しようとする動きがとても高く,私たちはほぼ困ることなく M1 で開発ができています.
一方で, M1 から amd64 向けにビルドするクロスアーキテクチャビルドはとても難しいままです.仮想マシンでビルドすることを考えても,VMWare や VirtualBox , Parallels Desktop でさえ M1 から amd64 向けの OS を起動できません (執筆時現在) .Docker BuildKit (BuildX) は QEMU を使うことでこの問題を解決しようとしているものの,アーキテクチャをまたぐことによるパフォーマンスの低下が起きたり,一部ビルドが SIGSEGV で落ちたりもします.
今回は,この問題から現実逃避して,リモートの amd64 マシンでビルドさせてしまう方法を紹介します.
BuildKit (BuildX) の有効化
Docker Desktop の Docker Engine 設定で features.buildkit
を true
にします.以下のようになります:
docker buildx version
コマンドで正常に BuildX が使えるか確認しましょう:
リモートマシンの準備
今回はリモートの amd64 マシンに SSH 経由で接続します.今回はリモートに Windows マシンを採用したため,以下を参考に SSH サーバを有効化しました.
Docker BuildX は SSH 接続時のパスワードプロンプトをうまくハンドルしてくれないので,公開鍵などインタラクションなしで接続できるような方法を使いましょう.
またこちらにも Docker Desktop を導入し,同様に BuildX を導入しておきます.リモートに Linux マシンを採用する場合は Docker Engine の設定のみで十分です.
Builder の追加
さて,それでは準備したリモートマシンをホスト側の BuildX に追加しましょう.
# ビルダ名とホスト名は適宜環境に合わせて設定してください.
docker buildx create --name z370 --driver docker-container --platform linux/amd64 ssh://siketyan@z370.v.s6n.jp
(optional) 既定の Builder の設定
このビルダを既定で使いたい場合は, docker buildx use
で設定しておきます.
docker buildx use z370
実際にビルドしてみる
これで設定は完了です.実際にビルドしてみましょう.
docker buildx build --builder z370 --load -t hoge/fuga:latest .
正常にビルドできれば成功です!
お疲れさまでした.
参考
以下の例では,今回とは逆に amd64 なマシンから aarch64 向けビルドをしています.