インスタンスにアプリケーション展開後、デプロイの度に実行される container_commands ですが、どのような環境下で実行されているのか気になったので実際にコマンドを叩いて確かめてみました。
チェックに使った設定ファイル
container_commands:
deploy_debug_dump:
command: |
id
env
pwd
尚、チェックに使った環境は以下です。
- デプロイ方式: All at once
- プラットフォーム: 64bit Amazon Linux 2017.03 v2.7.2 running Docker 17.03.1-ce
id
の結果:
uid=0(root) gid=0(root) groups=0(root)
ec2-user
などではなく root
として実行されるようですね。
env
の結果:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
PWD=/var/app/current
SHLVL=1
HOME=/root
EB_IS_COMMAND_LEADER=true
_=/bin/env
EB_IS_COMMAND_LEADER
が設定されてるのを確認できました。
container_command の属性値を leader_only: true
とした場合、複数インスタンスにデプロイする場合であっても Beanstalk によって選択された単一のインスタンス (=リーダー) でしかコマンドが実行されませんが、その際のリーダーかどうかの判定に使用されている変数のようです。
自身がリーダーかどうかは /opt/elasticbeanstalk/bin/leader-test.sh
のスクリプトでも判定可能です。
pwd
の結果:
/var/app/current
になってました。デプロイするとこのディレクトリ以下にアプリケーションが展開されます。
残された疑問点
次の記事を読むと以下のように書かれています。
container_command実行時には
/var/app/ondeck
がワーキングディレクトリとなっています。
ここはプロジェクトのzipが展開される準備用のディレクトリで、ここから/var/app/current
にコピーされてデプロイが完了します。
この説明を読むと先の pwd
の結果は /var/app/ondeck
になるように読めるのですが、実際は /var/app/current
になっていました。
ここらへんはデプロイ方式によって違ったりするのでしょうかね。
どちらにしてもデフォルトのワーキングディレクトリにアプリケーションが展開されていることは間違いなさそうなので、無理にワーキングディレクトリを変更せず相対パスで処理をしておくのが無難そうです。