🐳

PostgreSQL✖️Dockerスターターテンプレート

2024/10/11に公開

はじめに

DockerでテストDBを作成することは多いのですが、毎回構築方法を忘れてしまうので、ここにメモとして残しておくことにしました

ディレクトリ構成

./
├──init
│  ├──create_schema.sql
│  ├──create_tables.sql
│  └──insert_sample_data.sql
└──docker-compose.yml

docker-compose.yml

docker-compose.yml
version: '3'

services:
  db:
    image: postgres:17
    container_name: postgres_container
    ports:
      - 5432:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase
    restart: always

volumes:
  postgres_data:
  1. バージョン: Docker Composeのバージョン3を使用しています。
  2. イメージ: PostgreSQL 17を使用しています。必要に応じて別のバージョンに変更できます。
  3. コンテナ名: postgres_containerという名前でコンテナを作成します。
  4. ポート: ホストの5432ポートをコンテナの5432ポートにマッピングしています。
  5. ボリューム:
    • postgres_data: データベースファイルを永続化するためのボリュームです。
    • ./init: 初期化スクリプトを配置するディレクトリをマウントしています。
  6. 環境変数:
    • POSTGRES_USER: データベースユーザー名を設定します。
    • POSTGRES_PASSWORD: データベースパスワードを設定します。
    • POSTGRES_DB: 作成するデータベース名を指定します。
  7. 再起動ポリシー: alwaysを指定し、コンテナが停止した場合に自動的に再起動するようにしています。

DDL

./initディレクトリ内に配置する初期化スクリプトのサンプルを以下に示します。

create_schema.sql
CREATE SCHEMA IF NOT EXISTS myapp;
COMMENT ON SCHEMA myapp IS 'スキーマの説明をここに記述';
create_tables.sql
SET search_path TO myapp;
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE posts (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    title VARCHAR(200) NOT NULL,
    content TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE users IS 'ユーザー情報を格納するテーブル';
COMMENT ON TABLE posts IS 'ユーザーの投稿を格納するテーブル';
insert_sample_data.sql
SET search_path TO myapp;
INSERT INTO users (username, email)
VALUES ('user1', 'user1@example.com'),
    ('user2', 'user2@example.com');
INSERT INTO posts (user_id, title, content)
VALUES (1, '最初の投稿', 'これは最初の投稿の内容です。'),
    (1, '2番目の投稿', 'これは2番目の投稿の内容です。'),
    (2, 'user2の投稿', 'これはuser2による投稿です。');

確認

デタッチドモード(バックグラウンド)でコンテナを起動します

docker-compose up -d

データベースに接続して、パスワードを入力します

psql -d mydatabase -U user -h localhost
mydatabase=# SET search_path TO myapp;
SET
mydatabase=# select * from users;
 id | username |       email       |          created_at           
----+----------+-------------------+-------------------------------
  1 | user1    | user1@example.com | 2024-10-11 00:40:59.524203+00
  2 | user2    | user2@example.com | 2024-10-11 00:40:59.524203+00
(2)

./init以下のsqlファイルが実行され、データベースがセットアップされていることが確認できました。

Discussion