Wildcardな雑記

なんか書く

Docker(docker-compose)でPostgreSQLの環境構築の覚書

はじめに

Dockerを用いたPostgreSQLの環境構築について試したときのメモを書いておく.

以下を参考にした

やったこと

DockerでPostgreSQLサーバをコンテナとして起動して,クライアントプログラム(psql)からデータベースにアクセスしたりをやってみた.また,イメージの初回起動時に事前に.sqlファイルに定義したテーブルが作成されるようにしたりした.

環境構築の前に

以下を実行した.postgresのベースとなるイメージの取得と,PostgreSQLのクライアントの方のインストールを行う.

% docker pull postgres:14-alpine

クライアントが欲しい場合はlibpqをinstallする.

% brew install libpq

フォルダ構成

以下のような構成から成る.

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% tree -a .
.
├── docker-compose.yml
└── postgres
    ├── .env
    ├── Dockerfile
    └── db
        └── intidb.sql

2 directories, 4 files

各ファイルについて

docker-compose.yml

今回はローカルマシンの5433ポートからコンテナ内のpostgresサーバ(5432ポートで待機)にアクセスすることにする.

また,ユーザ情報等の環境変数の内容は外部のファイル".env"に分離したので,長くならずすっきりしたと思う.

また,イメージの初回起動時に実行される.sqlファイルを格納したフォルダはdocker-entrypoint-initdb.dにマウントされるように設定した.

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% cat docker-compose.yml
version: '3'

services:
  db:
    container_name: test-postgres-db
    build: ./postgres/
    env_file: ./postgres/.env
    volumes:
      - ./postgres/db:/docker-entrypoint-initdb.d
    ports:
      - "5433:5432"

Dockerfile

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% cat postgres/Dockerfile
FROM postgres:14-alpine
ENV LANG ja_JP.utf8

.env (ユーザ情報を定義した環境変数をまとめたファイル)

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% cat postgres/.env
POSTGRES_USER=postgres
POSTGRES_PASSWORD=hogehogepw
POSTGRES_DB=test_db

init.sql

コンテナ起動時に,データベースにテーブルが作成するようにする.以下の仮のテーブル(名前を保存する"members")を作ってみる.

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% cat postgres/db/intidb.sql
CREATE TABLE members (
  id integer,
  name varchar(30)
);
INSERT INTO members VALUES (1, 'John Smith');
INSERT INTO members VALUES (2, 'Richard Roe');

membersと名付けたテーブルに適当なエントリを挿入した.

イメージのビルド

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% docker-compose build

コンテナの起動

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% docker-compose up -d
Creating network "docker-postgres_default" with the default driver
Creating test-postgres-db ... done

クライアント(psql)でデータベースにアクセスしてみる

postgresサーバに接続

% psql -h localhost -p 5433 -U postgres
Password for user postgres:
psql (14.1)
Type "help" for help.

イメージが初回起動したときに作成されたデータベース(test_db)に接続し,membersテーブルからデータを取得する.

postgres=# \c test_db
You are now connected to database "test_db" as user "postgres".
test_db=# \dt
          List of relations
 Schema |  Name   | Type  |  Owner
--------+---------+-------+----------
 public | members | table | postgres
(1 row)


test_db=# select * from members;
 id |    name
----+-------------
  1 | John Smith
  2 | Richard Roe
(2 rows)


test_db=# \q

最後に (後片付け)

期待通りに動いたのを確認した後は以下のようにコンテナを終了してボリュームも一緒に削除した.

[~/Code/Project/proj_y2021/proj1229/docker-postgres]
% docker-compose down --rmi all --volumes