解決策
Dockerイメージをビルドする際に、--platform
オプションでどのプラットフォーム (OSおよびCPUアーキテクチャの組み合わせ) に対応したイメージを作成するかを指定する。
docker build --platform=linux/amd64 -t [タグ名] .
ビルド後にECRへDockerイメージをプッシュし、ECSのタスクを実行すると無事に処理が完了した。
このオプションにより、「マルチCPUアーキテクチャ」に対応したイメージのビルドができる。
他には、--platform amd64
の指定でも解決するようである。
エラーの原因
Dockerイメージを作成したM1 MacOSと、ECSでコンテナが動くFargateのCPUアーキテクチャが違うためにエラーとなった。
つまり、今回のエラーは、イメージをビルドしたマシンと、コンテナを実行するマシンのCPUアーキテクチャが異なるために発生する。
ECRのリポジトリにAWSマネジメントコンソールからアクセスすると「プッシュコマンドの表示」というボタンがあり、ECRリポジトリへのDockerイメージのプッシュ手順を見ることができる。
Linux/MacOSとWindowsとで手順とコマンドを分けて表示してくれているので、コピペして使うことができる。
しかし、その手順をそのまま行うだけではタスク実行時にエラーが出た。
M1 MacOS上で、platformオプションを指定せずにDockerイメージをビルドしたためである。
DockerイメージのECRへのプッシュ時には警告やエラーは出ないので気付きにくい。
参考資料
-
'exec user process caused: exec format error' in AWS Fargate Service
- Docker BuildxというCLIプラグインを使った解決例があるが、このプラグインは今回は不要
- ECSタスク起動時のstandard_init_linux.go:228: exec user process caused: exec format errorへの対処法
- M1 mac docker error: exec user process caused "exec format error"
-
ECSのタスク起動時に「standard_init_linux.go」関連のエラーが出た場合の対処方法
- 同一or似たエラーメッセージで原因が異なるパターンがあるようなので注意
- Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする