#困った事
テストで、Dockerコンテナの起動停止を何度もしなければいけない。
docker-compose.ymlでいくらサービスを集約しても、graylogやconsulなど、サービス単位が増えると、ymlがあるフォルダまで移動~起動コマンドを叩いたり、docker psするのが非常に面倒。。さらにテスト・本番環境のコンテナが同一環境にあってさらに面倒。。
#解決策検討
解決策 | 考察 | 採用 |
---|---|---|
kubernetes | 学習コスト高い | X |
.sh | 書き方わかんない | O |
短絡的に、.shを勉強してみたいのと、他に方法思いつかないので.sh作ってみた。
前提条件(補足)
- ymlに「container_name:名前」でコンテナ名を定義する。
- 事情によりymlが格納されたフォルダ名とコンテナ名に違いがある。
#解決
docker-up.sh
#!bin/bash
# 目的:本番環境コンテナの作成
# 処理の流れ:
# 1 起動中のコンテナ名を取得
# 2 未稼働のコンテナ名を特定
# 3 コンテナ数が一致すれば全量満たしている為処理終了
# 4 差分があれば処理継続
# 登場ファイル
# /tmp/confirmed_container_counts.txt -> 必要コンテナ数
# /tmp/now_established_container_names.txt -> 起動中コンテナ名
# /tmp/now_established_container_counts.txt -> 起動中コンテナ数
# 全量のコンテナ名を配列の値へいざnow(新たにコンテナが増えた際は、コンテナ名をここに追記)
confirmed_containers_name=("containerA" "containerB" "containerC" "containerD" "containerE")
# 想定する必要なコンテナ数を/tmp/confirmed_container_counts.txtに書き出し。
echo ">>> 必要コンテナ(数) >>>"
echo "${#confirmed_containers_name[*]}"
echo "${#confirmed_containers_name[*]}" > /tmp/confirmed_container_counts.txt
# 起動中のコンテナ名を取得(names列名が含まれるため最初の1行削除)
docker ps --format "table {{.Names}}" > /tmp/now_established_container_names.txt
sed -i '1d' /tmp/now_established_container_names.txt
echo ">>> 起動中コンテナ(名) >>>"
cat /tmp/now_established_container_names.txt
sleep 2
# 起動中のコンテナ数を把握
echo ">>> 起動中のコンテナ(数) >>>>"
cat /tmp/now_established_container_names.txt | wc -l
cat /tmp/now_established_container_names.txt | wc -l > /tmp/now_established_container_counts.txt
sleep 5
echo ">>> コンテナ数差分チェック開始 >>>"
# コンテナ数を比較
diff -s /tmp/confirmed_container_counts.txt /tmp/now_established_container_counts.txt
# 必要数を満たしていれば処理終了
if [ $? = 0 ]; then
echo ">>> 本番コンテナは全量起動中です。処理を終了します >>>"
else
echo ">>> コンテナは全量ではないため後続処理開始 >>>"
# コンテナが全量でない場合の処理
# 必要コンテナ名群から1コンテナ名ずつ取り出し、起動中コンテナ名と合致するか正誤判定
for v in ${confirmed_containers_name[@]}
do
grep -q $v /tmp/now_established_container_names.txt
if [ $? = 1 ]; then
case "$v" in
# 実際は正規表現。
containerA*)
cd 'containerAのymlがあるディレクトリ'
docker-compose up --build -d
;;
containerB*)
cd 'containerAのymlがあるディレクトリ'
docker-compose up --build -d
;;
containerC*)
cd 'containerAのymlがあるディレクトリ'
docker-compose up --build -d
;;
containerD*)
cd 'containerAのymlがあるディレクトリ'
docker-compose up --build -d
;;
containerE*)
cd 'containerAのymlがあるディレクトリ'
docker-compose up --build -d
esac
fi
done
fi
#振り返り
意図した動作になり、結果作業は楽になった。.shに対するレベルが1ミリ上がった。
Qiitaデビューを果たした。
#反省
- コンテナの増減に合わせて、ハードコーディングしなければいけないので、サービス名は外だしすればよかた。
- 順序性が保たれない想定外の動きをしたため、sleepを利用しているが、正しい使用方法なのか調査。
- コンテナ起動時のエラーに関しては、ファイルへ出力してもいいかもしれない(共有目的)。
- upかdownかstopかを変数に入れて、起動停止ができたらなおよし。
- イメージ構築が不必要な時にbuildいらないな。。