Tech カテゴリのイメージ

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でそのまま動かそうとした場合などに典型的に出ます。

対処

  1. まず自分の環境とイメージのアーキテクチャを確認します。
Terminal window
uname -m # ホスト側(arm64 なら Apple Silicon)
docker inspect --format='{{.Architecture}}' <image>
  1. マルチアーキ対応のイメージなら、プラットフォームを明示して取得し直します。
Terminal window
docker pull --platform linux/amd64 <image>
docker run --platform linux/amd64 <image>

Apple Siliconではエミュレーション経由になるため動作しますが、速度は落ちます。

  1. 自分でビルドする場合は、buildxでマルチアーキ対応のイメージを作ります。
Terminal window
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:latest --push .
  1. 恒久的にはarm64向けのベースイメージやビルド済みバイナリを使うのが、エミュレーションのオーバーヘッドがなく最も速い解決です。

まとめ

・原因はコンテナ内実行ファイルとホストCPUのアーキテクチャ不一致 ・uname -mとdocker inspectで双方のアーキテクチャを確認する ・応急は —platform linux/amd64 でエミュレーション実行 ・恒久対応はbuildxでarm64対応イメージを用意する