Docker の exec format error:原因と解決策
冒頭まとめ exec format error は Docker が作った文言ではありません。Linux がプログラムを起動する際に返す ENOEXEC という結果を、そのまま表示したものです。 公式のマニュアルには、この結果の意味が1文で書かれています。実行可能ファイルが認識できる形式でない、アーキテクチャが違う、あるいは実行できない何らかの形式上の問題がある、という3つが並記されています。 したがって原因は2系統に分かれます。1つ目は CPU アーキテクチャの不一致です。Docker の公式文書は理由まで説明しています。コンテナはホストのカーネルを共有するため、中で動くコードはホストのアーキテクチャと互換でなければならない。だから linux/amd64 のコンテナを arm64 のホストで(エミュレーションなしに)動かすことはできない、と明記されています。 2つ目は、実行しようとした対象がそもそも実行可能な形式でない場合です。先頭行に実行系の指定が無いスクリプトを直接起動しようとした場合が典型です。 そして重要な境界があります。no such file or directory は別の系統です。マニュアルでは、指定したファイルや、スクリプトの実行系、あるいは必要な共有ライブラリが見つからない場合の結果として区別されています。ファイルは確かにあるのに「無い」と言われる現象は、こちらの系統です。 エラーの概要 実行時に出る文言は、実行系の階層をそのまま反映した形になります。 docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec /entrypoint.sh: exec format error 長く見えますが、読むべきは末尾だけです。unable to start container process: までは実行系が付け加えた前置きで、実装でもこの文言でくるむ処理が確認できます。その後ろの exec <対象>: exec format error が本体です。 ...