Dockerを使って、PostgreSQLのサーバーを立て、テーブル作成とCSVでデータを取り込むまでをやってみました。
docker-composeの記事はそこそこあったけど、なぜかDockerfile単独のはあんまりなかったのと、DockerでCSVデータを取り込むまでの話はほとんどなかったので、そこまで含めたという点で、参考になる方がいましたら、という記事です。
概要
- postgres - Official Image | Docker Hub を使って、自分用のサーバーを立てる
- あらかじめ定義したDDLを使ってCREATE TABLE
- あらかじめ用意した、テーブルごとのCSVを使ってインポート(COPYというPostgreSQL独自のコマンド)
ソースは下記にあります。
1. Dockerfileでサーバーを立てる
Dockerfileの全容は下記です。
FROM postgres:15.3
# 作成用の環境変数
ENV POSTGRES_DB mydatabase
ENV POSTGRES_USER myuser
ENV POSTGRES_PASSWORD mypassword
# クライアントで接続するための環境変数
ENV PGDATABASE mydatabase
ENV PGUSER myuser
ENV PGPASSWORD mypassword
EXPOSE 5432
COPY ./init/init.sh /docker-entrypoint-initdb.d/init.sh
COPY ./init/ /tmp/init_data/
使っているベースのイメージは postgres:15.3 。URLに使い方とか丁寧に書いてあります。
すごく気持ち悪いけど、同じような環境変数を立ててます。PostgreSQLサーバーを作るときの環境変数と、クライアントとしてそこへ接続するための環境変数。微妙に名前が違います。
クライアントとしての環境変数の説明は、PostgreSQL 8.2.6文書 環境変数 を参考に。
あと、/docker-entrypoint-initdb.d/
へ初期実行してほしいshファイルをコピーするのと、それに使用するファイルを/tmp/init_data/
にコピーしてます。
このフォルダに、*.sql
か*.sql.gz
か*.sh
を置いておくと、実行される仕組みです。今回は、init.sh
を置きました。
psql -f /tmp/init_data/ddl.sql
psql -f /tmp/init_data/init_data_import.sql
SQLファイルを指定して、PostgreSQL(psql)を実行してるだけです。
環境変数でPGDATABASE
とかを指定しているので、接続先やユーザー名は指定しなくてもつながります。もし環境変数で指定していないとすると、ここで接続先やらを書く必要があり、避けたかったのです。
2. あらかじめ定義したDDLを使ってCREATE TABLE
init.sh
の1行目で実行する処理。
SQLの中身はCREATE TABLE
してるだけです。
CREATE TABLE IF NOT EXISTS books (
book_id integer,
book_name varchar(100),
author_id integer
);
CREATE TABLE IF NOT EXISTS authors (
author_id integer,
author_name varchar(100)
);
3. あらかじめ用意した、テーブルごとのCSVを使ってインポート(COPYというPostgreSQL独自のコマンド)
COPY
というクエリで、CSVをインポートします。
COPY books FROM '/tmp/init_data/init_data_books.csv'
WITH (FORMAT csv, HEADER true);
COPY authors FROM '/tmp/init_data/init_data_authors.csv'
WITH (FORMAT csv, HEADER true);
独特だけど、複雑なことをやってるわけではないので、そういうモンなんだと理解します。
CSVファイルの置き場所は、Dockerfile
で指定した場所です。
実行
準備は以上で、あとは実行。ポートを開けるのとVOLUMEでデータを永続化することを忘れずに。
# ビルド
docker build -t mypostgre . --no-cache
# イメージから実行
docker run -p 5432:5432 -v ./mypostgresql_data:/var/lib/postgresql/data mypostgre
無事実行出来たら、ホスト(Windows端末・DockerコマンドをたたいているPC)で、任意のDBクライアントソフトを使って、localhost:5432へ、指定したDB、ユーザー、パスワードで接続すれば確認OKです。プログラムからも接続できます。
まとめ
テーブルを作成するだけでなく、初期データまでインポートする例でした。
Dockerfileでできればdocker-composeもできます。