なんだかGoodVibes

日々の勉強メモです。

【Docker】起動時にDBの初期データを投入する

こんにちは。
本日もDockerについてです。

概要

docker-composeで起動したとき、
DBの初期データを投入したい...


初期データ投入用のSQLを作成

まず、初期データを作成するための
SQLを用意します。

docker-compose.ymlと同じ階層に
initdbというディレクトリを作成します。

このディレクトリ配下にSQLを作成します。

  • テーブル作成SQL(01-setup.sql)
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
);
  • レコード挿入SQL(02-initdata.sql)
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)

ちゃんと追加されているのが確認できました!



以上です。