夕蛙のなく頃に

データアナリストとして学んだことや趣味で勉強し始めたIoTをアウトプットする

DockerでDB(PostgreSQL)環境を作る

DockerでDB(PostgreSQL)環境を作り、手元で用意したcsvデータを初期データとして流し込むところまで作ります。

WebアプリのDBとして使うことを想定し、Docker Composeで構築していきます。

ファイル構成

❯ tree .
.
├── docker-compose.yml
└── postgres
    ├── 1_createdb.sh
    ├── 2_createdata.sh
    ├── Dockerfile
    └── data.csv

Dockerfile

postgresディレクトリ内のファイルをdocker-entrypoint-initdb.dディレクトリにコピーすることで、イメージ起動時に自動的にDB作成スクリプトやデータ流し込みスクリプトを実行させることができます。

> cat postgres/Dockerfile
FROM postgres:9.6.5
ENV TZ=Asia/Tokyo
ENV LANG ja_JP.UTF-8
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
COPY * /docker-entrypoint-initdb.d/

スクリプト

プレフィックスに数字を振ることで順番にスクリプトが走ります。

  1. DB作成 --> 2. テーブル作成&CSVからデータ流し込み
> cat postgres/1_createdb.sh
psql << EOSQL
  CREATE DATABASE testdb;
  GRANT ALL PRIVILEGES ON DATABASE testdb TO postgres;
EOSQL
> cat postgres/2_createdata.sh
psql -U postgres -d testdb << EOSQL
CREATE TABLE testtable
(
  id integer,
  value integer
);
COPY testtable (
  id,
  value
) FROM '/docker-entrypoint-initdb.d/data.csv' WITH CSV;
EOSQL
> cat postgres/data.csv
1,100
2,200
3,300
4,400

docker-compose.yml

postgresというホスト名で、ユーザー名とパスワードだけ変数を設定、5432番のポートを公開します。

例えば他サービスからは以下のように設定することでDBにアクセスできます。

postgres://ユーザー名:パスワード@ホスト名:ポート番号/DB名
postgres://postgres:postgres@postgres:5432/testdb

> cat docker-compose.yml
version: "3"
services:
  postgres:
    build: postgres/
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"

起動〜データ確認

# コンテナ立ち上げ
> docker-compose up -d

# コンテナ名確認
> docker ps

# コンテナ内に入る
> docker exec コンテナ名 /bin/bash

# postgresql内に入る
> pdql -U postgres -d testdb

# テーブルのデータ確認
testdb=# SELECT * FROM testtable;
 id | value
----+-------
  1 |   100
  2 |   200
  3 |   300
  4 |   400

用意したcsvが入ったテーブルが作成されていることを確認できました!