環境
・AWS Linux
・Unicornコンテナを立ててRailsアプリケーション起動
・RAILSの中でRAILS_ENVとかDB接続設定を環境変数化してる
・docker-composeを利用してコンテナ起動
・docker build時にbundle installしてない。コンテナを立ち上げながらbusyboxをボリュームしてbundle installしてる
手順
改めてcloud-init自動起動ON
chkconfig cloud-init on
/var/lib/cloud/scripts/per-boot下にスクリプト作成
vim /var/lib/cloud/scripts/per-boot/start_container.sh
※start_container.shではなくてもよい。拡張子だけ.shにする
#!/bin/sh
. /etc/profile
cd $RAILS_ROOT;/usr/local/bin/docker-compose up -d &
※事前にdocker-composeのパスをwhich docker-compose
で確認しておく
環境変数設定
Rails起動時に必要な環境変数を
/etc/profile.d/docker.shに定義しておく
vim /etc/profile.d/docker.sh
export RAILS_ENV='production'
export DB_HOST='xxx'
epxort DB_PASSWORD='xxx'
chmod 744 /etc/profile.d/docker.sh
chown root:root /etc/profile.d/docker.sh
rootユーザーが実行できるように権限与えた(cloud-initはrootユーザーで実行される)
サーバ再起動&動作確認
shutdown -r now
でサーバ再起動してからdocker ps
で指定したコンテナが立ち上がらって且つ正常に動いてることを確認すればオッケー
ハマったこと
環境変数が適用されなかった
/etc/profile
に環境変数を定義しておいてもcloud-initが/var/lib/cloud/scripts/per-boot
下のスクリプトを実行するタイミングが先みたいで環境変数が適用されずDBに接続されないとかのエラーでrailsが起動しなかった
以下のように記述しても環境変数が適用されない(sourceコマンドは見つからないし、/bin/shだと sh: 0: Can't open /etc/profile.d/docker.sh
と出てる。なんでだろう。実行権限あげたのに!!)
vim /var/lib/cloud/scripts/per-boot/start_container.sh
source /etc/profile.d/docker.sh
/bin/sh /etc/profile.d/docker.sh
exportで直接書くと解消されたが、そのため環境変数が二か所に分けるのはださい。などでハマってましたが、なんと。。. /etc/profile
にしたらうまく適用された!
docker-composeコマンドのパスも/etc/profileに定義したPATHが適用される前にcloud-initが動くので適用されない。面倒くさいからフルパスで記載しておくことで解決しました。
cloud-initの実行挙動
cloud-initの実行挙動についてはこちらを参考しました。