開発環境で利用していた Dockerfile
を Mac m1 を搭載した筐体にて動かしたところ、以下のエラーメッセージが出て困った。
FROM mysql:8.0.2
failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6: not found
M1チップはARMのプロセッサを利用しており、従来のDockerイメージで利用する各種モジュールの前提であるamd64系のメモリ管理手法では、docker run
で起動した際に読み込まれるパッケージの管理がうまく動作しないことがある。
具体的には以下のようなエラーが発生する場合がある。
cc1plus: error: unknown value 'armv8-a-march=armv8-a' for -march cc1plus: note: valid arguments are: armv8-a armv8.1-a armv8.2-a armv8.3-a
参考サイトにも記載があるが、上記エラーはdocker pull
時にARM64プラットフォーム向けのイメージを優先して取得することにより発生する。
docker pull 時に、指定したDockerイメージに、ARM64プラットフォーム向けにビルドされたものがあればそれを、なければx86_64プラットフォームのものが選択されてpullされます。
明示的に利用するプロセッサを指定することで、MacのRosetta2
でエミュレートして起動する。
コマンドラインからの起動方法
docker run
を行う際に、--platform=linux/amd64
のオプションを付与して起動を行う。
例:MySQLのコンテナを立てる
docker run --platform=linux/amd64 mysql:8.0.20
- 以下でも動作します
docker run --platform=linux/x86_64 mysql:8.0.20
Dockerfileからの起動方法
FROM
句で起動イメージを指定する際にオプションを付与する。
- 例:MySQLのコンテナを立てる
FROM --platform=linux/amd64 mysql:8.0.20