結論
PostgreSQLの公式イメージは、コンテナの初回起動時にサンプルデータを登録することができる。
初回起動時に/docker-entrypoint-initdb.d
のディレクトリ内に配置された特定の拡張子のファイルが実行される。
このディレクトリに、サンプルデータ設定用のスクリプトを配置すると、コンテナ起動時に初期データが設定される。
DBコンテナ起動時に初期データを設定する
docker-compose.yml
の例を示す。
services:
db:
image: arm64v8/postgres:16.1-alpine
volumes:
- ./db/init:/docker-entrypoint-initdb.d # 追加
environment:
POSTGRES_PASSWORD: secret
dbコンテナのdocker-entrypoint-initdb.d
にローカルのディレクトリをマウントしている。
./db/init
内のファイルがdocker-entrypoint-initdb.d
に配置される。
このディレクトリにマウントされたファイルは、コンテナの起動時に一度だけ実行される。
実行されるファイルの拡張子は、sh
, sql
, sql.gz
のみである。
複数のファイルをマウントした場合、辞書順で実行される。
また、直下のファイルのみが実行される。
実例
今回の実際の対応内容を示しておく。
複数のファイルをマウントした場合、辞書順で実行される。
ファイル名を変えるのはあまり好きでなかったので、適切な順番通りにSQLを呼び出すsh
を用意し、対象のディレクトリにマウントした。
#!/bin/bash
# シェルから任意の実行したい順でファイルを実行する。
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f ../sql/create_table.sql
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f ../sql/grant_user_access.sql
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f ../sql/insert_record.sql
初期データについては、別のディレクトリにマウントした。
services:
db:
image: arm64v8/postgres:16.1-alpine
volumes:
- ./db/init:/docker-entrypoint-initdb.d
- ./db/sql/sample_data:/initdb # サンプルデータをコンテナのファイルシステムにマウントする。
environment:
POSTGRES_PASSWORD: secret