why
前回の記事で、DB を Docker Compose で立ち上げて、ローカルから接続することができた。
しかし、それでは Database を作っただけで、中身のテーブルがない
なのでそれを作る処理をする
docker-compose.yml で PSQL DB と USER を作って SQL を読み込めるようにする
Docker Compose のファイル
version: '3.2'
services:
#
# PostgreSQL
#
person-db:
image: postgres:14-bullseye
container_name: person-db
ports:
- 5444:5432
volumes:
- ./postgresql/init:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: kaede
POSTGRES_PASSWORD: pass
POSTGRES_DB: person
POSTGRES_INIT_DB_ARGS: --encoding=UTF-8
restart: always
- 最初に読み込む SQL ファイルの場所を指定
- ルートユーザーとルートユーザーのパスワードを作成
- DB を作成
ここまで動く。
docker-compose up
person-db | server started
person-db | CREATE DATABASE
person-db |
person-db |
person-db | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/00-init.sql
これで
volumes:
- ./postgresql/init:/docker-entrypoint-initdb.d
これは volumes で
ローカルの ./postgresql/init/
の中身を
Docker の /docker-entrypoint-initdb.d が実行されるときの読み込み先に指定している。
これによって ./postgresql/init/
の .sql ファイルが
Docker Compose up 時にファイル名順に実行されるようになる。
00-init.sql で USER に権限をつけて、person DB に行って、person テーブルを作ってレコードを追加する。
SQL で CREATE DB とか CREATE USER は書く必要はない。
docker-compose.yml の environment の
POSTGRES_{ DB, USER, PASS } で作成できるから。
ルートユーザー以外も作りたい場合は必要。
GRANT ALL PRIVILEGES ON DATABASE person TO kaede;
\c person
create table person(
id int not null,
name text,
age int
);
insert into person values (1,'Taro', 5);
insert into person values (2,'Hana', 3);
- kaede というユーザーに personDB の全権を渡す
- person DB に移動
- テーブル作成
- テーブルの初期データ挿入 (SQL では string を "" で書くとエラーになるので注意)
こうして、docker compose 起動後に読み込まれる SQL にこれを書くことで
person-db | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/00-init.sql
person-db | GRANT
person-db | You are now connected to database "person" as user "kaede".
person-db | CREATE TABLE
person-db | INSERT 0 1
person-db | INSERT 0 1
こうやって docker で動いてログがでて
person=# \dt
List of relations
Schema | Name | Type | Owner
--------+--------+-------+-------
public | person | table | kaede
テーブルが作成されて
person=# select * from person;
id | name | age
----+------+-----
1 | Taro | 5
2 | Hana | 3
(2 rows)
データが入る。
初期実行 SQL 変更時の注意点
docker-compose up
のあと、初期実行 SQL を変更したら
docker-compose down -v する必要が有る。
Docker コンテナを止めても Docker 内部の Volumes に DB は残るので
SQL ファイルを書き直しても DB は更新されない。
なので Volumes を破棄する必要が有る。
docker-compose kill containerName で
毎回コンテナごと破棄するのも有り。
だが、なかのボリュームだけ破棄するのがベターなので
--volumes でボリュームを落とす。
Top comments (0)