容器

【備忘録】Mac m1 チップ搭載機にてdocker runが失敗する

何で困っていたか


開発環境で利用していた 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