0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DBコンテナ起動時に初期データを設定する

Posted at

結論

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

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?