Container

DockerでPostgreSQLの起動を待ってからWEBサービスを起動する

2019/02/09

Dockerでよくある構成って下記のようなWEB+DBが多いと思います。
Docker(WEB+DB).png
でもこの環境を作るのって意外と難しいんです。
PostgreSQLが起動する前にWEBサービスが起動して、DBに接続できなくてWEBコンテナが落ちてしまう。。。という残念なことになりがちです。 DBコンテナが準備できるまで待とう!ということでいろいろ調べてみました。

ゴール

PostgreSQLの起動を待ってからjarファイルを実行したい。

前提

必要なツール

docker
docker-compose

知識

docker,docker-compose触ったことある

やっていく

depends_on

サービス間の依存関係を指定したら、2つの効果があります。
docker-compose up を実行したら、依存関係のある順番に従ってサービスを起動します。以下の例では、 web を開始する前に db と redis を実行します。
docker-compose up サービス(の名称) を実行したら、自動的に サービス の依存関係を処理します。以下の例では、 docker-compose up web を実行したら、 db と redis も作成・起動します。

ただこれはコンテナの起動の順番を制御するのみでサービスの起動までは面倒見てくれません。

シェルで制御

結局シェルで制御するしか方法はないみたいです。 Dockerのドキュメントにも書いてありました。
Compose の起動順番を制御 — Docker-docs-ja 17.06.Beta ドキュメント run.shファイルを下記のように作成します。 docker-compose.ymlファイルのentrypointでrun.sh java -jar /app/connectTest.jarと書くとPostgreSQLの起動後、java -jar /app/connectTest.jarを実行します。

サンプルアプリケーション

javaでDBに接続してcenterinfoのテーブルのcenterinfoカラムを出力するjarファイルを作成しました。
これをWEBコンテナに設置してlogsにテーブルデータが出力されれば正常に動作します。
ソースはここにあります。
docker-compose.ymlファイルでDockerのWEBコンテナのイメージを作成しています。 Dockerfileの中身はシンプルでjarファイルをイメージの中にADDしているだけです。

データのインサート

コンテナの起動 テーブル作成とデータのインサートをします。
test/createTable.sqlinsert.sqlを実行してください。

動作確認

コンテナを再起動します。 webコンテナのログを確認 最下行にweb-container | 0という出力があれば成功です

Docker,Kubernetesについてもっと知りたい方はココナラからご連絡ください!

-Container
-, ,

Translate »