はじめに
Intel Macで動作していたDocker利用のアプリケーションがM2に換えてから動かなくなりました🚑
アプリケーション内ではGoogle Chrome(Chrome)を利用しており、Python × Seleniumから利用しています。
結論から言うとDocker Desktop for MacのBeta機能Use Rosetta for x86/amd64 emulation on Apple Silicon
を使うことで解消できました👨💻
こちらの機能は2023年1月にリリースされました。これより以前の「AppleシリコンMac上でChromeとDockerを動かす」系記事を読む際には時系列をご留意いただくと良いかもしれません。
環境
- Apple M2 Max / macOS Ventura
- Docker Desktop for Mac 4.16.2
Dockerfileの構成とエラー
FROM foo
# ...
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
# ...
# コンテナ起動後アプリケーション内のChrome利用箇所でクラッシュ
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed.
(chrome not reachable)
(The process started from chrome location /usr/bin/google-chrome-stable is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
どうもエラーの雰囲気として、Chromeプロセスがいないため落ちてそうです。
原因
少し話題が飛びますが、大前提としてDockerイメージは各CPUアーキテクチャに応じて作られます。
docker pull
するとホストマシンのアーキテクチャに合わせたイメージが取得でき、Intel Macであればx86(amd64)
用が、Appleシリコンならarm64
用イメージが落ちてきます。
ただしarm64
向けがDocker Hub上に無い場合(例. 一昔前のMySQLイメージ)や、どうしても別CPUアーキテクチャのイメージが欲しい場合もあるかと思います。
その場合platform
で別アーキテクチャを明示的に指定すれば取得することができます。
# x86向けイメージが取得できる
platform: linux/x86_64
Docker Desktop for Mac内にはQEMUが同梱されているため異なるCPUアーキテクチャ向けイメージを動かせます。
QEMUとは何ぞや?という方はCPU等をエミュレートできる仕組みだとざっくり捉えてください。
さてここからが本題です。
arm64
向けのChromeバイナリは現在提供されていないため、AppleシリコンMacにてChromeを動かすためにはx86
向けのイメージ上で、x86
向けのChromeを動かす必要があります。
ところが(Docker Desktop for Macにおける)QEMUは飽くまでベストエフォート動作であるため時に不具合が発生します。
今回もQEMU起因でChromeがうまく立ち上がらないことがエラー原因になっているようです。
ここで問題があり、QEMUのエミュレーションは完璧ではありません。一部の命令がサポートされておらず、それを使用するイメージは実行時にSegmentation Faultで終了します。
Google Chromeもこれに該当し、M1 Macのlinux/amd64上で動かした場合には動作しません。
Prior to this feature, the only option for running x86-based Docker images on Macs with Apple Silicon processors was through QEMU emulation, which could often result in compatibility issues and runtime crashes with particular images. However, with the integration of Rosetta 2 support, users can now expect a smoother experience when running their x86-based Docker images on Apple Silicon Mac systems.
Docker on Apple Silicon Mac: How to Run x86 Containers with Rosetta 2
解決策
4.16以降のDocker Desktop for MacにはQEMUの代わりにRosettaでエミュレートする機能が追加されています。
こちらをONにすることで正常に実行できました!
現地時間2023年01月12日にDocker, Inc.が公開した「Docker Desktop for Mac v4.16」では、この新機能を利用し、macOS 13 Ventura以降のApple Silicon Mac上で、IntelベースのDockerイメージをエミュレートする機能がBetaサポートされているそうです。
設定方法は至ってシンプルでDocker Desktop > Dashboard > 設定(歯車アイコン) > Use Rosetta for x86/amd64 emulation on Apple Silicon
にチェックを入れます。
合わせて設定 > General > Use Virtualization framework
にもチェックを入れておきましょう(こちらはデフォでチェック入っていると思います)。
Applyすると再起動するかと思いますのでdocker compose up
なりで実行してみてください。
終わりに
AppleシリコンMac上のDockerコンテナでChromeを動かす方法をまとめました。
Rosettaの利用でQEMU特有のバグを踏みづらくなるだけでなくパフォーマンスの向上も期待できるとのことです。
Additionally, as Rosetta 2 is specifically designed by Apple for the macOS operating system and thanks to the optimizations Apple has integrated into its Apple Silicon CPUs, it is expected to provide improved performance and compatibility compared to QEMU emulation.
Docker on Apple Silicon Mac: How to Run x86 Containers with Rosetta 2
今回はDocker Desktop for Macを使いましたが、様々な事情でRancher Desktop等を利用する場合もあるかと思いますので、その周辺もできれば調査したいと思います。