TWBMT

技術的な記事や覚書について書いていきます。その内、自作サイトとかに技術記事をまとめたい。

【Docker】M1 Macで arm64 に対応していない Docker コンテナを動かす。

TL;DR

  • M1 Mac上で arm64 に対応していないDockerイメージ(MySQLなど)やライブラリ(numpyなど)を使用したい。
  • Dockerfile を build するだけではなく docker-compose を利用したい。
  • 環境変数 DOCKER_DEFAULT_PLATFORMlinux/amd64 を指定すると、コンテナを amd64 アーキテクチャで起動する事が出来た。

Docker の M1 Macの対応状況 (2022/01/12時点)

Docker Desktop の arm64 に対応していないコンテナ( MySQL など)は amd64 版のコンテナを動かす事で対応できるとのこと。
ただし、一部の APILinux の inotify など)が完全に動作しない事もあり「 Arm ベースのマシンで Intel ベースのコンテナを実行することは「ベストエフォート」としてのみ見なされるべき」という記載もあります。
Docker Desktop for Apple silicon | Docker Documentation

ファイルやネットワーク周りの OS の機能を触る時は不具合を引くこともありそうですが、特定のランタイムやソフトウェアを使用するだけなら問題なさそうですね。

linux/amd64 を指定して Docker コンテナを動かす方法

  1. 環境変数 DOCKER_DEFAULT_PLATFORMlinux/amd64 を指定する。
    DOCKER_DEFAULT_PLATFORM は Docker CLI--platform オプションがサポートされているコマンドに対して、使用するデフォルトのプラットフォームを変更できます。
    Docker コマンドラインの利用 | Docker ドキュメント

  2. 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.ymlplatform を指定する方法

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

参考

M1 Mac にnumpy, matplotlibなどが入らない問題の解消法 - Qiita