standard_init_linux.go: exec format error の対処
このエラーは、コンテナ内の実行ファイルが、いま動かしているCPUのアーキテクチャ向けにビルドされていないときに出ます。よくあるのは、Apple Silicon(M1/M2以降、arm64)で、amd64向けにビルドされたイメージやバイナリを動かそうとしたケースです。
standard_init_linux.go:228: exec user process caused: exec format error原因
Dockerイメージは特定のCPUアーキテクチャ(amd64、arm64など)向けにビルドされています。イメージの中の実行ファイルが、ホストと違うアーキテクチャ向けだと、カーネルが実行形式を認識できずこのエラーになります。x86_64向けのイメージをArm Macでそのまま動かそうとした場合などに典型的に出ます。
対処
- まず自分の環境とイメージのアーキテクチャを確認します。
uname -m # ホスト側(arm64 なら Apple Silicon)docker inspect --format='{{.Architecture}}' <image>- マルチアーキ対応のイメージなら、プラットフォームを明示して取得し直します。
docker pull --platform linux/amd64 <image>docker run --platform linux/amd64 <image>Apple Siliconではエミュレーション経由になるため動作しますが、速度は落ちます。
- 自分でビルドする場合は、buildxでマルチアーキ対応のイメージを作ります。
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest --push .- 恒久的にはarm64向けのベースイメージやビルド済みバイナリを使うのが、エミュレーションのオーバーヘッドがなく最も速い解決です。
まとめ
・原因はコンテナ内実行ファイルとホストCPUのアーキテクチャ不一致 ・uname -mとdocker inspectで双方のアーキテクチャを確認する ・応急は —platform linux/amd64 でエミュレーション実行 ・恒久対応はbuildxでarm64対応イメージを用意する