本投稿はdipアドベントカレンダー5日目の記事です。
PostgreSQLをDBとしたアプリケーション開発のローカルDockerで初期設定がよくわからなかったのでまとめてみました。
※docker-composeで構築していきます。
サンプルリポジトリは下記です。
GitHub - unagiya/postgres-ja-docker
先にDockerfileとdocker-compose.yamlを表示し、一つづつ見ていくことにしましょう。
Dockerfileは下記のようにします。
FROM postgres:13.1 ARG DB_LANG=en_US RUN localedef -i $DB_LANG -c -f UTF-8 -A /usr/share/locale/locale.alias $DB_LANG.UTF-8 ENV LANG $DB_LANG.utf8
これはPostgreSQLのlocaleでja_JPがデフォルトでは有効になっていないため、日本語で動かしたい場合はDockerfileを用意する必要があります。 言語部分はbuild時に外から取れるようARGとして定義し、デフォルトではen_USを設定しています。
次にdcoker-compose.yamlです。
version: '3' services: db: build: context: . dockerfile: ./build/docker/postgres/Dockerfile args: - DB_LANG=ja_JP ports: - "5432:5432" volumes: - ./tmp/db:/var/lib/postgresql/data - ./build/docker/postgres/initdb:/docker-entrypoint-initdb.d environment: - POSTGRES_USER - POSTGRES_PASSWORD - POSTGRES_DB - TZ
db(service)
dbという名前は別途好きな名前に変えてしまって良いと思います。
この単位でコンテナの定義をしていきます。
build
今回はDockerfileを利用するため、build項目でいくつかの設定を行います。
- context
- contextはカレントワーキングディレクトリの指定です。
- 未指定の場合、Dockerfileがある場所がワーキングディレクトリとされ、上位、並列階層の別ディレクトリを参照できなくなるため、docker-compose.yamlと同位の場所を指定しています。
- dockerfile
- 今回はDockerfileを用意しているので、そのファイルがどこにあるかを指定します。
- args
- Dockerfile内でARG設定がある場合、に指定します。
- 今回はja_JPをDockerfileに渡したいためDockerfile内に存在するDB_LANGを指定します。
localeを気にしていない場合、buildは特に指定せずimageで直接指定してしまっていたりすると思うので細かく説明しました。
ports
portsはホストOSと通信をするときのポートフォワードの設定です。
"ホストOSのポート:ゲストOSのポート"で設定します。
volumes
ここではデータの永続化やコンテナに渡したいファイルが有る場合、設定を行います。
今回は2つのディレクトリを指定しています。
./tmp/db:/var/lib/postgresql/data
上記ディレクトリはデータの永続化を行うためにマウントしています。
postgresのデータ領域にホストOS側のディレクトリをマウントすることでデータの消失を抑えます。
また、上で説明した context
で .
を指定しているため、Dockerはtmpディレクトリを認識してくれます。
次のディレクトリは初回起動時に実行するスクリプトを入れておくためのディレクトリです。
./build/docker/postgres/initdb:/docker-entrypoint-initdb.d
通常テーブルの作成はマイグレーションなどで行うためあまり使うことはありませんが、拡張機能の有効化などを行うときに利用します。
サンプルリポジトリでは下記SQLを格納しています。
CREATE EXTENSION IF NOT EXISTS pg_trgm;
これはPostgreSQLの標準拡張機能のトリグラムを有効化するためのコマンドです。
environment
dockerに環境変数を与えるための項目です。
キー名のみ設定していますが、これは内容を .env
に逃がしているためです。
docker-composeは environment
と .env
をマッピングして環境変数を設定します。
postgresのdockerでは環境変数 POSTGRES_DB
にDB名を指定しておくことで起動時に指定したDBを作成します。
すべての説明が終わったので実際に起動させてみましょう。
ビルドをしてからUPします。
$ docker-compose build $ docker-compose up
立ち上がったら接続確認を行ってみましょう。
正常に立ち上がり、拡張機能が有効になっていることがわかります。
かんたんな解説でしたが、以上です。