18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

M1 (M2) Mac上のDockerコンテナでChromeを動かす方法 2023年版

Posted at

はじめに

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の構成とエラー

Dockerfile.example
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で別アーキテクチャを明示的に指定すれば取得することができます。

docker-compose.yaml
# 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上で動かした場合には動作しません。

M1 MacのDockerでChromiumを使ったFeature Specを動かす

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サポートされているそうです。

macOS 13 VenturaのRosetta for Linuxを利用し、IntelベースイメージをApple SiliconでエミュレートすることをBetaサポートした「Docker Desktop v4.16」がリリース。

設定方法は至ってシンプルでDocker Desktop > Dashboard > 設定(歯車アイコン) > Use Rosetta for x86/amd64 emulation on Apple Siliconにチェックを入れます。
合わせて設定 > General > Use Virtualization frameworkにもチェックを入れておきましょう(こちらはデフォでチェック入っていると思います)。
Applyすると再起動するかと思いますのでdocker compose upなりで実行してみてください。

image.png

終わりに

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等を利用する場合もあるかと思いますので、その周辺もできれば調査したいと思います。

18
11
0

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
18
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?