背景
先日Amazon Linuxの公式コンテナイメージが公開されたので
以下のようなアプリケーション開発のフローを導入しようと考えました。
- Docker for MacでAmazon Linuxのコンテナを作成
- コンテナのイメージをElastic Container Registry(ECR)に置く
- Elastic Beanstalk(EB)にデプロイ
実装前にざっと試してみた際にハマったエラーについて書きます。
現象
DockerfileでAmazon Linuxをベースイメージとしたコンテナを作成し
それをECRにpushしたあと、EBにdockerrun.aws.jsonを渡すフローでした。
しかし、dockerrun.aws.jsonをEBに渡したあと
正常にデプロイが開始されたあと、以下のようなエラーが出ました。
[Instance: i-95ad6d0b] Command failed on instance. Return code: 1 Output: 563f980e33e19b2b43cbf556249bba19de0f5bf2f69d1b6cb67a3fc997ce6468 Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Sat Nov 19 15:02:16 UTC 2016:. Check snapshot logs for details. Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
原因がよくわからないので、/var/log/eb-activity.log
を確認します。
インスタンスは正常に起動しているので、$ eb ssh
で接続も可能です。
[2016-11-19T15:02:16.395Z] INFO [3459] - [Application deployment First Release@1/StartupStage1/AppDeployEnactHook/00run.sh] : Activity execution failed, because: 563f980e33e19b2b43cbf556249bb
a19de0f5bf2f69d1b6cb67a3fc997ce6468
曰く、原因はやはり563f980e33e19b2b43cbf556249bb
です。さっぱりわかりません。
a19de0f5bf2f69d1b6cb67a3fc997ce6468
原因
以下に抜粋したログ曰く、新しいイメージのビルドは正常に終了しているので
コンテナの起動自体はうまくいっているように思えます。
Step 1 : FROM 405040101050.dkr.ecr.ap-northeast-1.amazonaws.com/ecr_eb_test:latest
---> ed42ad0aada6
Step 2 : EXPOSE 80
---> Running in be7d342bdfd1
---> 42ae4c2ba2df
Removing intermediate container be7d342bdfd1
Successfully built 42ae4c2ba2df
Successfully built aws_beanstalk/staging-app
dockerのイベントログを見てみると
2016-11-20T06:45:22.851433959Z container start 99b8db428bb7a404e485929b98c6653e9cc7a170503e1b31dc4d0890a0161f21 (image=3f7f5bfd4721, name=backstabbing_mcclintock)
2016-11-20T06:45:22.877845383Z container die 99b8db428bb7a404e485929b98c6653e9cc7a170503e1b31dc4d0890a0161f21 (exitCode=0, image=3f7f5bfd4721, name=backstabbing_mcclintock)
コンテナが起動後に即死しているのがわかります。
なんとなく問題が見えてきました。
このときに使用していたDockerfileの記述は以下の通りです。
# ベースイメージとしてamazonlinuxを使用
FROM amazonlinux:latest
# 80番ポートを開放
EXPOSE 80
# このファイルを元にコンテナが動いていることの確認用
RUN touch /opt/test
フォアグラウンドのプロセスが存在しないため、コンテナが保持されませんね。
解決
以下のように書き直すと正常にデプロイできました。
# ベースイメージとしてamazonlinuxを使用
FROM amazonlinux:latest
# 80番ポートを開放
EXPOSE 80
# apacheをインストール
RUN yum install -y httpd
# apacheをフォアグラウンドで起動
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
まとめ
後になってみると、非常に初歩的なミスでした。
Dockerの基礎を理解していればすぐにわかります。
しかし、原因をまったく教えてくれないEBのエラーログ…。
今回は関連するログを網羅的に見ました。
少しでも同じログにぶつかった人の参考になればと思います。