Edited at

cloud-init利用してAWS LinuxでDockerコンテナ自動起動

More than 3 years have passed since last update.


環境

・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の実行挙動についてはこちらを参考しました。