【Docker】M1 Macで arm64 に対応していない Docker コンテナを動かす。
TL;DR
- M1 Mac上で arm64 に対応していないDockerイメージ(MySQLなど)やライブラリ(numpyなど)を使用したい。
Dockerfile
を build するだけではなくdocker-compose
を利用したい。- 環境変数
DOCKER_DEFAULT_PLATFORM
でlinux/amd64
を指定すると、コンテナを amd64 アーキテクチャで起動する事が出来た。
Docker の M1 Macの対応状況 (2022/01/12時点)
Docker Desktop の arm64 に対応していないコンテナ( MySQL など)は amd64 版のコンテナを動かす事で対応できるとのこと。
ただし、一部の API(Linux の inotify など)が完全に動作しない事もあり「 Arm ベースのマシンで Intel ベースのコンテナを実行することは「ベストエフォート」としてのみ見なされるべき」という記載もあります。
Docker Desktop for Apple silicon | Docker Documentation
ファイルやネットワーク周りの OS の機能を触る時は不具合を引くこともありそうですが、特定のランタイムやソフトウェアを使用するだけなら問題なさそうですね。
linux/amd64 を指定して Docker コンテナを動かす方法
環境変数
DOCKER_DEFAULT_PLATFORM
にlinux/amd64
を指定する。
DOCKER_DEFAULT_PLATFORM
は Docker CLI の--platform
オプションがサポートされているコマンドに対して、使用するデフォルトのプラットフォームを変更できます。
Docker コマンドラインの利用 | Docker ドキュメントdocker compose up
を実行する。
これで docker-compose.yml
を書き換えたりせずに、コンテナを amd64 アーキテクチャで起動する事が出来ます。
何故、 DOCKER_DEFAULT_PLATFORM
で動くのか
ドキュメントによると DOCKER_DEFAULT_PLATFORM
は --platform
オプションがサポートされているコマンドに対して機能すると書いてあります。
しかし、docker compose
には --platform
オプションは明記されていません。
この部分に関しては直接的なソースやリファレンスを見つける事が出来ませんでしたが、docker-compose build
の場合、docker cli を用いているという記述を確認しました。
docker-compose build | Docker Documentation
恐らくこれと同様に内部的に Docker CLI を使用している為、 --platform
オプションが有効に働いていると予想しています。
余談: docker-compose.yml
で platform
を指定する方法
Docker Compose で調べると platform
オプションでservice毎に platform
を指定する方法が出てきます。
例えば、以下の様な docker-compose.yml
でも動作することを確認しました。
version: "3.6" services: db: image: mysql:8.0 platform: linux/x86_64
ただし、少しこの辺り不可解な事がありまして、公式の Compose v3 リファレンスにはplatform
オプションの記載がありません。
Compose file version 3 reference | Docker Documentation
しかし、Compose v2 リファレンスや Github の最新の Compose Spec(Composeの仕様)には platform
の記載があります。
Compose ファイル バージョン 2 リファレンス | Docker ドキュメント
compose-spec/spec.md at master · compose-spec/compose-spec · GitHub
以下のissueとリリースノートによるとv2スキーマとv3スキーマを統合し、COMPOSE_SPECと合わせるとある為、platform
オプションがある事が正しい様子です。
もしかしたらドキュメントの更新が追いついていないのかもしれませんね。
https://github.com/docker/compose/pull/5985#issuecomment-683395676
Release 1.27.0-rc1 · docker/compose · GitHub