🤖
M2 MacでビルドしたDockerコンテナをAWS App Runnerにデプロイすると失敗する
はじめに
タイトルの通り、Docker化したNode.jsサーバをローカルでビルドし、ECRにプッシュ。その後そのイメージをApp Runnerにデプロイしようとしたところ失敗しました。
結論
DockerイメージとApp Runnerのプラットフォームでアーキテクチャのズレがあったのが原因でした。
私の使用しているM2 MacbookのCPUアーキテクチャはlinux/arm64で、何も指定せずdocker build
を行うとlinux/arm64でビルドされます。
かたや、App Runnerのアーキテクチャはlinux/amd64にしか対応していないそうです。
このアーキテクチャの違いによってデプロイ時に下記エラーが発生しました。
exec /docker-entrypoint.sh: exec format error
ちなみにApp Runnerのイベントログではなく、Cloud Watchのほうにエラーログが出力されていました。デプロイ時ではなく実行時に起因するものだからでしょうか。AWSに慣れていないので少し時間を食ってしまいました。
対策
docker buildコマンドにアーキテクチャを指定するか、Dockerfileにアーキテクチャを明記しましょう。
docker build --platform linux/amd64 -t imagename ./
もしくは
Dockerfile
FROM --platform=linux/amd64 node:18-alpine
でビルドすることにより、想定したアーキテクチャが使用されます。後者の方がオペレーションミスの発生を防ぐことができそうです。
まとめ
以前Google CloudのCloud RunでDockerイメージをデプロイするときも同じようなミスを犯したような気がするので、自戒と啓蒙のため投稿しました。
Discussion