📕

【M1 Mac】LaravelプロジェクトをECSにデプロイし、タスクを実行する場合のプラットフォームの指定について

2023/09/01に公開

Laravelプロジェクトのイメージをローカルでビルドし、それをECS上で実行(タスクの実行)する際に、プラットフォームを指定していなかったため、それぞれでエラーが発生しました。😭

ローカルでLaravelプロジェクトのイメージをビルドすると表示されるエラー

次のようにERROR FROM docker.io/<イメージ名>/composer:latest failed to load cache key: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failedというエラーが表示されました。

[+] Building 9.2s (10/14)                                                                          
 => [internal] load build definition from Dockerfile                                          0.0s
 => => transferring dockerfile: 731B                                                          0.0s
 => [internal] load .dockerignore                                                             0.0s
 => => transferring context: 34B                                                              0.0s
 => [internal] load metadata for docker.io/library/php:7.4-fpm                                2.0s
 => [auth] library/php:pull token for registry-1.docker.io                                    0.0s
 => [internal] load build context                                                             0.0s
 => => transferring context: 5.96kB                                                           0.0s
 => ERROR FROM docker.io/<イメージ名>/composer:latest                                         7.0s

# 〜省略〜

------
failed to load cache key: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed

ECSでタスクを実行した際のエラー

CloudWatch>ロググループ>イベントログで確認するとexec /usr/local/bin/docker-php-entrypoint: exec format errorと表示されました。

エラーの原因について

プラットフォームの不一致が原因です。

Dockerイメージが異なるプラットフォームでイメージのビルドやECSクラスターでタスクを実行しようとするとプラットフォームの不一致によりエラーが発生する可能性があるので、適したプラットフォームを指定する必要があります。

イメージのビルドとECSタスクの実行の両方が成功する2つのパターン

①LaravelのDockerfileのみプラットフォームを指定する

Head Dockerfileでプラットフォームを指定(例:FROM --platform=linux/amd64 php:7.4-fpm) イメージのビルド時にプラットフォームを指定(例:--platform=linux/amd64)
Composer × ×
Laravel ×

②ComposerとLaravelのDockerfile、build時に全てでプラットフォームを指定する

Head Dockerfileでプラットフォームを指定(例:FROM --platform=linux/amd64 php:7.4-fpm) イメージのビルド時にプラットフォームを指定(例:--platform=linux/amd64)
Composer
Laravel

パターン①で問題が発生していない場合、そのまま続けても問題はないかもしれませんが一貫性を保つために、すべてのコンテナイメージでプラットフォームを指定して同じプラットフォームでビルドされるようにした方が良いです。

以上の理由から、パターン②(ComposerとLaravelのDockerfile、ビルド時に全てでプラットフォームを指定する)を使用してください!

余談(自分メモ)

タスク実行のみの場合は、Nginxにプラットフォームの指定は不要です。

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion