こんにちは。
本日もDockerについてです。
概要
docker-composeで起動したとき、
DBの初期データを投入したい...
初期データ投入用のSQLを作成
まず、初期データを作成するための
SQLを用意します。
docker-compose.ymlと同じ階層に
initdbというディレクトリを作成します。
CREATE TABLE IF NOT EXISTS fruits ( "id" bigint NOT NULL UNIQUE, "name" varchar(30) NOT NULL, "colorid" bigint NOT NULL ); CREATE TABLE IF NOT EXISTS colors ( "id" bigint NOT NULL UNIQUE, "name" varchar(30) NOT NULL );
BEGIN; INSERT INTO fruits (id,name,colorid) VALUES (1,'strawberry',3), (2,'meron',4), (3,'orange',6); INSERT INTO colors (id,name) VALUES (1,'white'), (2,'black'), (3,'red'), (4,'green'), (5,'blue'), (6,'yellow'); COMMIT;
投入データの作成はこれで完了です。
docker-compose.ymlの調整
まず、データを保存する先を作成する必要があります。
volumesで定義します。
ボリュームを作成することで、コンテナが削除されても
ボリュームが削除されない限りはデータが残ります。
docker-compose.ymlに以下を追加します。
volumes: my-data: name: my-data driver: local
では、次は定義したボリュームをdb01に割り当てて、
初期データの設定を行います。
db01に以下を追加します。
volumes:
- my-data:/var/lib/postgresql/data
- ./initdb:/docker-entrypoint-initdb.d
追加後のdocker-compose.ymlの全体は以下です。
version: '3' volumes: my-data: name: my-data driver: local networks: default: name: bridge mynetwork01: name: mynetwork01 services: db01: container_name: db01 build: context: . dockerfile: Dockerfile.db01 tty: false ports: - 5432:5432 volumes: - my-data:/var/lib/postgresql/data - ./initdb:/docker-entrypoint-initdb.d networks: - mynetwork01 env_file: - env.db01 app01: container_name: app01 build: context: . dockerfile: Dockerfile.app01 tty: false ports: - 8080:8080 networks: - mynetwork01 env_file: - env.app01
では、起動してデータベースが追加されているか確認しましょう。
mydb=# \d List of relations Schema | Name | Type | Owner --------+--------+-------+------- public | colors | table | mydb public | fruits | table | mydb mydb=# select * from fruits; id | name | colorid ----+------------+--------- 1 | strawberry | 3 2 | meron | 4 3 | orange | 6 (3 rows) mydb=# select * from colors; id | name ----+-------- 1 | white 2 | black 3 | red 4 | green 5 | blue 6 | yellow (6 rows)
ちゃんと追加されているのが確認できました!
以上です。