今回は、DockerでPostgresを立ち上げるときに、初期データを自動作成する方法について説明していきます。

Dockerを使うとコンテナを落とした時に保存されていたデータや、データベース、スキーマなどが全て削除されてしまいます。
Dockerを立ち上げる度にデータを準備するのは面倒だと思うので自動化していきましょう。
PostgresでCRUDのSQL操作を覚えよう
- 前提: Docker + Postgresの準備
- 初期データ用のSQL準備
- DockerfileでSQLをコピーする
1.前提: Docker + Postgresの準備
この記事の内容を試すにあたり、まだDockerの準備やPostgresの使い方が分からない方は以下の記事をご確認ください。
本記事は、以下の2つの記事が完了していることを前提としてます。
【エンジニア向け】Macbook + docker-composeでpostgresを動かす
【エンジニア初級】PostgresでCRUDのSQL操作を覚えよう
docker-compose.ymlの設定内容は、現在以下の通りになっています。
version: '3.1'
services:
  db:
    build:
      context: .
      dockerfile: postgres/Dockerfile
    container_name: postgres
    ports:
      - 5432:5432
    restart: always
    environment:
      POSTGRES_PASSWORD: example
2.初期データ用のSQL準備
今回は、以下の環境を自動で作成するための準備を行います。
- testdbというデータベースを作成
- employeeというテーブルを準備
- employeeテーブルに3件分のデータを準備
「init.sql」というDDLを準備します。
create database testdb ENCODING = 'UTF8';
\c testdb;
CREATE TABLE employee (
  id bigint,
  name varchar(50),
  job varchar(20)
);
INSERT INTO employee (id, name, job) VALUES (1, '田中太郎', 'エンジニア');
INSERT INTO employee (id, name, job) VALUES (2, '鈴木花子', 'デザイナー');
INSERT INTO employee (id, name, job) VALUES (3, '山下哲也', '営業');フォルダの構成は以下のようになっています。
docker-compose.yml
postgres
   |-Dockerfile
   |-init.sql3.DockerfileでSQLをコピーする
最後に先ほど作成した「init.sql」をコンテナ内にコピーする処理を追加します。
「Dockerfile」を開いて以下を追加します。
FROM postgres:12
ENV TZ Asia/Tokyo
ENV LANG ja_JP.UTF-8
ENV LC_ALL "en_US.UTF-8"
ENV LC_TYPE "en_US.UTF-8"
#初期データ用のSQO追加
COPY postgres/*.sql /docker-entrypoint-initdb.d/
RUN chmod 755 /docker-entrypoint-initdb.d/*.sqldockerが立ち上げっていたら一度落としましょう。
$ docker-compose down再度、dockerを立ち上げます。
$ docker-compose up -d --buildデータが追加されていることが確認しましょう。
まずはdockerにログインします。
$ docker exec --user postgres -it $(docker ps -aqf "name=postgres") /bin/bashpostgresにログインします。
$ psql最後にデータを確認します。
postgres=# \c testdb
You are now connected to database "testdb" as user "postgres".
testdb=# \d
          List of relations
 Schema |   Name   | Type  |  Owner
--------+----------+-------+----------
 public | employee | table | postgres
(1 row)
testdb=# select * from employee;
 id |   name   |    job
----+----------+------------
  1 | 田中太郎 | エンジニア
  2 | 鈴木花子 | デザイナー
  3 | 山下哲也 | 営業
(3 rows)無事、3件分のデータが作成されていれば成功です!
Postgresをこれから勉強したい方には、以下の書籍がおすすめです。
|  | これからはじめる PostgreSQL入門【電子書籍】[ 高塚遙 ] 価格:3,278円 | 

===============
以上、DockerでPostgres立ち上げ時に初期データを自動で作成する方法について解説してみました。
この情報が皆さんの人生のお役に立てれば幸いです。
エンジニアとして日本のITリテラシーを高めていきたいと共感して頂いた人は、是非このブログの拡散とyoutubeの方も見ていただけると嬉しいです。
記事を最後まで見ていただきありがとうございました。
執筆者: hiroエンジニア
