この記事では、dockerでPostgreSQLの環境を構築する際に、DBやテーブル、データをセットアップする方法を記載します。
docker-composeを使用してDB起動時に初期設定ファイルを読み込むと、ファイルに記載した設定通りにセットアップが可能です。
DockerでPostgreSQL起動時に初期セットアップする手順
1. 全体のフォルダ構成
.
├── docker-compose.yml
└── postgresql
├── Dockerfile
└── init
└── init.sql
- docker-compose.yml: docker-composeで複数コンテナを起動するファイル
- Dockerfile: PostgreSQLのイメージを作成するファイル
- init.sql: DBの初期セットアップを行うファイル
2. docker-compose.ymlの作成
version: '3'
services:
postgresql:
container_name: postgresql
build: ./postgresql
ports:
- 5432:5432
volumes:
- ./postgresql/init:/docker-entrypoint-initdb.d
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
restart: always
- サービス名はpostgresql
- container_name: コンテナ名
- build: Dockerfileのあるディレクトリを指定
- ports: ポートを公開(ホスト:コンテナ)
- volumes: ホスト側のパスをコンテナにマウント(ホスト:コンテナ)
- environment: 環境変数を指定(POSTGRES_USERは省略するとpostgresになる)
- restart: always指定でコンテナが停止しても再起動
Dockerfileでビルドせずにimageを指定する場合は、buildの代わりにimage: postgres:バージョンを指定します。
DBの初期セットアップを行うときは、volumesで/docker-entrypoint-initdb.dに対して.sql、.sql.gzまたは.shファイルをマウントします。ここでは、./postgresql/initのフォルダ内にinit.sqlのファイルを配置して、それをマウントするようにしています。
3. Dockerfileの作成
FROM postgres:14.0-alpine
DockerfileにはFROM postgresql:バージョンだけでOKです。
docker-compose.ymlにimage: postgresql:バージョンを指定する場合は、Dockerfileは必要ありません。
4. DBの初期セットアップ用ファイルを作成
--ユーザーの作成
CREATE USER docker;
--DBの作成
CREATE DATABASE docker;
--ユーザーにDBの権限をまとめて付与
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
--ユーザーを切り替え
\c docker
--テーブルを作成
CREATE TABLE book (
id integer,
name varchar(30)
);
--テーブルにデータを挿入
INSERT INTO book VALUES (1,'The Very Hungry Caterpillar');
docker-compose.ymlのvolumesでマウントするinit.sqlファイルを作成します。
ここではdockerというユーザーとDBを作成して、そこにテーブルを作成しました。
ユーザーの切り替えを行わない場合、POSTGRES_USERに指定した値のDBが作成され、そのDBにテーブルが作成されます。少し注意が必要です。
5. docker-compose upで起動してDBを確認
docker-compose up -d
-dオプションをつけるとバックグラウンドで実行されます。
ローカルからdockerで立ち上げたコンテナに接続する場合、docker execコマンドを使用します。
docker exec -it postgresql bash
docker exec -it <コンテナ名> bashで接続可能です。ここではコンテナ名にpostgresqlを指定します。
docker execについて詳細は別の記事に書きました。こちらを参考にしてください。
次に、PostgreSQLに接続してみます。POSTGRES_USERで指定したuserで接続します。
bash-5.1# psql -U user
psql (14.0)
Type "help" for help.
user=#
無事、psql -U userで接続できました。
データベース一覧を確認して、userとdockerがあることを確認します。
user=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+------------+------------+-------------------
docker | user | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/user +
| | | | | user=CTc/user +
| | | | | docker=CTc/user
postgres | user | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | user | UTF8 | en_US.utf8 | en_US.utf8 | =c/user +
| | | | | user=CTc/user
template1 | user | UTF8 | en_US.utf8 | en_US.utf8 | =c/user +
| | | | | user=CTc/user
user | user | UTF8 | en_US.utf8 | en_US.utf8 |
(5 rows)
userにはテーブルを作成していないので、何もありません。
user=# \d
Did not find any relations.
dockerに切り替えて作成したテーブルがあることを確認します。
user=# \c docker
You are now connected to database "docker" as user "user".
docker=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+-------
public | book | table | user
(1 row)
テーブルのデータもチェックします。
docker=# select * from book;
id | name
----+-----------------------------
1 | The Very Hungry Caterpillar
(1 row)
問題なく初期セットアップができているようです。
6. docker-compose downでコンテナを停止
docker-compose down --rmi local
–rmi localのオプションをつけると、Dockerfileで作成したイメージも削除してくれます。
以上。終わりです。
コメント