概要
macOS上 で Docker Desktop の Virtualization Framework を有効にしている際に Segmentation Fault によるエラーでビルドが失敗する問題について説明します.
先に結論(追記欄にも記載)を申し上げますと,「Use Rosetta for x86/amd64 emulation on Apple Siliconがオンになっていれば解決」できます。
経緯
2024/02/01にリリースされた Docker 4.27.1 にアップデート. その後ビルドが通らなくなり,Docker 4.27.0 へダウングレードを実行. しかし,依然として同じビルドエラー(Segmentation Fault)が発生.なにかメモリアクセスに問題があるのか...
ここで,Virtualization Framework が悪さをしている可能性を見つけました.(参考) Dockerをアップデートした時に,Docker desktop の設定で Virtualization Framework が有効になっていたと考えられます.
原因
Docker DesktopのVirtualization Framework が有効になっていること. この機能は,macOS 12.5以降で利用可能であり,コンテナのパフォーマンス向上を目的としていますが,特定のビルドプロセスにおいて互換性の問題を引き起こす可能性があります.
解決策
問題の解決のため,以下の手順を踏みました:(最善の解決策は"追記"をご覧ください)
- Docker Desktopの設定を開き,"Use Virtualization framework"のチェックを外して無効にする. この時,Choose file sharing implementation for your containers にて,VirtioFS 選択中ではチェックが外せないので,それ以外の gRPC FUSE,osxfs (Legacy)のどれかを選びます.今回は gRPC FUSE を選びました.
2.Docker Desktopを再起動する. 再びビルドを実行し,問題が解決したことを確認します.
結論
Virtualization Frameworkは,特定の環境下でビルドプロセスに影響を及ぼす可能性があるため,ビルドに失敗する場合は,この機能を無効にしてみることが推奨されます.
追記
Use Rosetta for x86/amd64 emulation on Apple Siliconがオンになっていれば問題ない。
備考
- VirtioFS
VirtioFSは,最新の技術であり,macOS 12.5以降で使用可能です.バインドマウントの操作に関するI/Oパフォーマンスの向上を目的としています.この実装は,Virtualization Frameworkを利用しており,高速なファイルアクセス速度を提供します. 推奨される使用シナリオ: 高いI/Oパフォーマンスが必要な場合や,最新の技術を利用して開発環境を最適化したい場合に適しています.macOS 12.5以降を使用しているユーザーに推奨されます.
- gRPC FUSE
gRPC FUSEは,安定性と互換性を提供する比較的新しい実装です.従来のosxfsよりもパフォーマンスが向上していますが,VirtioFSほどではありません.しかし,ほとんどの開発ワークロードで良好に機能します. 推奨される使用シナリオ: 一般的な開発用途で,安定性と適度なパフォーマンスが求められる場合に適しています.また,macOSの古いバージョンを使用しているユーザーや,Virtualization Frameworkを使用できないユーザーにも適しています.
- osxfs(レガシー)
osxfsは,Docker Desktop for Macの初期バージョンで使用されていたファイル共有実装です.他の2つのオプションに比べてパフォーマンスが劣りますが,一部のレガシーシステムや特定の互換性の問題に対処する場合に依然として有用です. 推奨される使用シナリオ: 特定の古いプロジェクトや,新しいファイル共有実装で問題が発生する特殊なケースに対応する必要がある場合に適しています. 選択にあたって パフォーマンス重視: VirtioFSを選択します(macOS 12.5以降で利用可能). バランスの取れた選択: gRPC FUSEを選択します.多くの場合,良好なパフォーマンスと互換性を提供します. レガシーな互換性が必要: osxfsを選択します.ただし,このオプションはパフォーマンスが低下する可能性があるため,特定の理由がない限り他のオプションを推奨します.
参考文献
"macOS上のDocker Desktopでviteを実行しようとするとSegmentation Faultが起きる," https://zenn.dev/alcnaka/articles/1c26387722a371,(Accessed on 2024/02/15)