びくんびくんしながらコードを書く。

いしきひくい系エンジニアのらくがき帳

PostgreSQLをDockerで動かすときの初期設定

本投稿は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

立ち上がったら接続確認を行ってみましょう。

正常に立ち上がり、拡張機能が有効になっていることがわかります。

postgresql起動確認
postgresql起動確認

かんたんな解説でしたが、以上です。