0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker複数コンテナの立ち上げが面倒な時の.sh(備忘録)

Last updated at Posted at 2021-10-26

#困った事

テストで、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いらないな。。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?