Container

postgresをDockerで動かすベストプラクティス

はじめに

タイトルのベストプラクティスは言いすぎたかもしれません...
今回は,Dockerでpostgresを動かします.
コンテナ起動時にデータインサートする方法,データが入ったイメージの作成方法をまとめました.

前提

  • Dockerインストール済
  • Dockerについての基本的な知識
  • docker compose触ったことある

環境

やっていく

コンテナ起動時にデータインサート

何番煎じだよ.という感じですが記事を参考にしてもうまくいかないことが多かったのでまとめました.
まずはdocker-compose.yml$PWD/docker/db/init/1_init.sqlファイルを作成します.

environmentで指定しているところが大事になります.
いろいろな記事でDBを作成するためにはcreate databasesqlファイルを作成してコンテナ起動時にdocker-entrypoint-initdb.dにマウントするとありますが,POSTGRES_DBに指定したDBはsqlファイルがなくても作成されます.

$PWD/docker/db/initディレクトリに1_init.sqlファイルを作成して,コンテナ起動時にマウントします.
このsqlファイルは1,2と連番で実行していくのでファイルの頭に1_をつけています.
またuse testdb;としていないのはデフォルトでPOSTGRES_DBで指定したDBにsqlファイルを実行するからです.

docker-compose up -d コマンドでコンテナを起動します.

下記コマンドでtestdbに接続できるので,データを確認しましょう.

データが入ったイメージの作成方法

上記作業でdb-containerというコンテナが起動しています.
コンテナを停止してdocker commitコマンドでイメージの作成はできますが,postgresqlのデータディレクトリである/var/lib/postgres/dataはイメージの中に保存されません.

これはpostgresの公式のDockerイメージのDockerfileを確認するとわかります.

docker-library/postgres
Docker Official Image packaging for Postgres. Contribute to docker-library/postgres development by creating an account on GitHub.

VOLUMEで指定されているところはイメージ作成時に除外されるようになっています.

なのでVOLUMEの行を削除して,postgresのイメージ自体を作る必要があります.

これでdocker commitコマンドでpostgresのデータディレクトリも含まれたイメージが作成されます.

作成されたイメージ名にdocker-compose.ymlファイルを書き換えて,docker-compose up -dを実行します.

実行した後にコンテナを停止して,docker commitコマンドを実行すればデータ入りのイメージが作成されます.
docker runで作成したイメージからコンテナを起動し,最後にDBに接続してデータを確認できたら完了です.

下記の関連記事も必要だったら見てください!

DockerでPostgreSQLの起動を待ってからWEBサービスを起動する
Dockerでよくある構成って下記のようなWEB+DBが多いと思います。 でもこの環境を作るのって意外と難しいんです。 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のドキュメントにも書いてありました。 run.shファイルを下記のように作成します。 [crayon-5cb34d6082b06242635165/] docker-compose.ymlファイルのentrypointでrun.sh java -jar /app/connectTest.jarと書くとPostgreSQLの起動後、java -jar /app/connectTest.jarを実行します。 サンプルアプリケーション javaでDBに接続してcenterinfoのテーブルのcenterinfoカラムを出力するjarファイルを作成しました。

-Container
-,

Translate »