🐘
Dockerを使ってPostgreSQLの学習環境をつくる
手軽にSQLを実行できる環境がほしかったので、PostgreSQL Tutorialで提供されているサンプルDBが動く環境をDockerで構築します。
compose.yaml
まず、docker compose
コマンドで起動する compose.yaml
をつくります。Docker Hubを見に行くとPostgreSQLのイメージがあるので、いくつか設定を追加します。
compose.yaml
version: "3.9"
services:
db:
build:
dockerfile: ./Dockerfile
restart: always
container_name: dvd_rental_db
environment:
POSTGRES_USER: postgres # コンテナ内のDBで作成されるsuperuser
POSTGRES_PASSWORD: postgres # superuserのパスワード
POSTGRES_DB: dvdrental # デフォルトDB
ports:
- 5432:5432
volumes:
- dvd_rental_data:/var/lib/postgresql/data # volumeを指定してデータを永続化
volumes:
dvd_rental_data:
Dockerfileと初期化スクリプト
続いてベースとなる postgres
イメージを拡張した Dockerfile
をつくります。初期データのリストアを毎回行うのは面倒なので、コンテナ起動時に実行されるようにします。
Dockerfile
FROM postgres:latest
# 初期データをダウンロードするためにCLIツールをインストール
RUN apt-get update && apt-get install -y \
wget \
unzip
# `/docker-entrypoint-initdb.d` は初期化用のDDLや、シェルスクリプトを配置するためのディレクトリ
# コンテナ起動時にデータが空であれば、これらが実行される
WORKDIR /docker-entrypoint-initdb.d
# 初期データをダウンロードして解凍
RUN wget -O dvdrental.zip https://neon.tech/postgresqltutorial/dvdrental.zip \
&& unzip dvdrental.zip \
&& rm dvdrental.zip
COPY ./init.sh /docker-entrypoint-initdb.d/
init.sh
#!/bin/bash
pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB" /docker-entrypoint-initdb.d/dvdrental.tar
使い方
docker compose
でコンテナを起動したうえで、任意のSQLクライアントからDBに接続します。dvdrental
内にテーブルが作成されていればOKです。
# 起動
docker compose up -d
[+] Running 1/1
✔ Container dvd_rental_db Started
0.0s
データを初期化したいときも、コンテナを作り直すだけで済みます。Dockerは使い捨てたいデータの環境構築にも便利ですね。
docker compose down
docker volume rm dvd_rental_store_dvd_rental_data # ボリューム名を指定して削除
docker compose up
Discussion