LoginSignup
33
17

More than 1 year has passed since last update.

M1 Mac での amd64 向け Docker ビルドが遅い?それならリモートでビルドすればいいじゃない!

Posted at

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.buildkittrue にします.以下のようになります:
image.png

docker buildx version コマンドで正常に BuildX が使えるか確認しましょう:
image.png

リモートマシンの準備

今回はリモートの 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 向けビルドをしています.

33
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
17