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/
スクリプト
プレフィックスに数字を振ることで順番にスクリプトが走ります。
- 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が入ったテーブルが作成されていることを確認できました!