こんにちは、ニキです。
今回は、ECS(Fargate)でexec format errorが出た時のトラブルシュートです。
クラスターとタスク定義を登録したのちにサービスを登録したところ、ECSコンソールに以下のエラーが出ていました。
exec /docker-entrypoint.sh: exec format error
タスク定義で以下を合わせる必要がありますが、異なっていると今回のエラーが発生します。
- 使用しているイメージのプラットフォーム
- ECSタスクのプラットフォーム
DockerイメージにはAMDとARMの2種類のプラットフォームがあり、M1 MACではデフォルトでARMを選択します。一方で、タスク定義のデフォルトはAMDなので、プラットフォームを指定しなければいけません。
プラットフォーム指定するには以下のどちらかで可能です。順番に解説していきます。
- イメージ作成時にプラットフォームを指定する
- タスク定義をイメージのプラットフォームに合わせる
Dockerイメージ作成時にプラットフォームを指定してexec format errorを解消する
3パターン紹介します。
- Dockerfileで指定する
- compose.yamlで指定する
- dockerコマンド実行時に指定する
Dockerfileで指定する
以下のように指定します。
FROM --platform=linux/x86_64 mysql:8.0
compose.yamlで指定する
以下のように指定します。
services:
service:
image: mysql:8.1
platform: linux/x86_64
dockerコマンド実行時に指定する
以下のようにビルドします。
docker build --platform PLATFORM DOCKER_FILE_PATH
例
docker build --platform linux/x86_64 ./
ECSタスク定義をイメージのプラットフォームに合わせてexec format errorを解消する
タスク定義ファイルを以下のように設定します。
今回はruntimePlatformにARMを指定しています。
{
"containerDefinitions": [
],
"runtimePlatform": {
"cpuArchitecture": "ARM64",
"operatingSystemFamily": "LINUX"
}
}
まとめ
今回は、ECS(Fargate)でexec format errorが出た時のトラブルシュートを紹介しました。