今回は意図せず開発環境の見直しを迫られた話になります。
- やりたかったこと
- 結果
- 結論
- DockerfileのFROMに指定したイメージはビルド端末のプラットフォームが適用される
- ARM64でAMD64向けイメージをビルドしたが.NET SDKが動かず
- 諦めてCodeBuildでAMD64向けイメージをビルドした
- AWSの動向
やりたかったこと
- 開発マシンであるApple M1でDockerイメージをビルドし、ECRにpushする。
- FargateでECSタスクを実行する。
結果
M1でビルドしたイメージがECRタスク実行時に動作しませんでした。CloudWatchでECSタスクのログを見たところ、exec format error
と出力されていました。
このエラーはホストのCPUアーキテクチャとベースイメージのCPUアーキテクチャが異なる時に発生するようです。
結論
ECSで稼働中のコンテナ側からuname -a
を実行したところ、Fargateのホストはx86_64で、ベースイメージのCPUアーキテクチャと異なる為にエラーが出ていたと思われます。
ARM64で動作させる設定は残念ながら見当たらず。
ARM64のEC2インスタンスでコンテナを立ち上げれば動くとは思いますが、今回は保守人員の関係上どうしてもFargateで動かしたかったのでCodeBuildでビルドすることになりました。
DockerfileのFROMに指定したイメージはビルド端末のプラットフォームが適用される
The optional --platform flag can be used to specify the platform of the image in case FROM references a multi-platform image. For example, linux/amd64, linux/arm64, or windows/amd64. By default, the target platform of the build request is used.
Docker公式にちゃんと書いてある仕様でしたが、これを知らず最初はApple M1(ARM64)でビルドしていた為、ARM向けイメージがpullされていたようです。 ビルド端末のCPUは意識しないといけませんね。
ARM64でAMD64向けイメージをビルドしたが.NET SDKが動かず
DockerfileのFROMにAMD64を指定して改めてイメージのビルドをしたところ、ECSタスクでコンテナ起動自体は成功しましたが、今度はコンテナ起動直後に実行するdotnet run
の処理でエラーが発生。
.NET SDK側で発生したエラーと思われます。 ARM64でAMD64向けイメージをビルドしたことが関係していると思うのですが、結局明確な原因は特定できず納期のこともあった為、ARM64でのビルドを断念することに…。
諦めてCodeBuildでAMD64向けイメージをビルドした
最終的にCodeBuild上のAMD64の端末からAMD64向けイメージをビルドしECRへpushしました。 ECSタスクを実行し、無事コンテナの動作確認もできた為、一件落着となりました。
AWSの動向
githubでは私と同じくFargateのホストをARMで動かしたいという要望が出ていました。 そのうち対応してくれるかもしれません。是非宜しくお願いします!