18
12

More than 1 year has passed since last update.

【PostgreSQL】docker-composeで起動と初期データ投入

Last updated at Posted at 2023-02-23

はじめに

備忘録がてら、docker-composeを用いたPostgreSQLの環境構築の方法を記述します。
ディレクトリ構成は以下の通りです。

docker
├── docker-compose.yml
├── image
│   └── postgres
│       └── Dockerfile
└── postgres
    └── init
        └── init.sql

ファイルの作成

docker-compose.yml

まずはじめにdocker-compose.ymlを作成します。
起動するためのコマンドであるdocker-compose up -dを叩いたときに読み込まれるファイルになります。

docker-compose.yml
version: '3'
services:
  postgres:
    container_name: sample-db
    build: ./image/postgres
    restart: always
    ports: 
      - "5432:5432"
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"

imageはDockerfileで定義しているので、それは次に説明します。
Dockerfileを使用しない場合は、build:の部分で以下のようにすることでimageを定義することもできます。

image: postgres:latest

Dockerfile

docker-compose.yml内のbuild:で指定したパスにDockerfileを作成してimageを定義します。
以下のように1行で定義すればOKです。

FROM postgres:15

今回はバージョン15を利用しています。

初期データ投入用のSQL

volumes:でSQLファイルの場所を指定することで、起動時にSQLを流すことができます。
パスの指定はvolumes:で指定されている内の前半部分である./postgres/initです。
ここにSQLファイルを作成します。

-- DB作成
CREATE DATABASE sample_db;
-- 作成したDBに接続
\c sample_db;
-- テーブル作成
DROP TABLE IF EXISTS sample;
CREATE TABLE sample (
	id integer NOT NULL PRIMARY KEY,
	name char(100) NOT NULL,
	created_date_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- ID用シーケンス作成
CREATE SEQUENCE sample_id_seq START 1;
-- サンブルデータの登録
INSERT INTO sample (id, name) VALUES(nextval('sample_id_seq'), 'sample name');

SQLの内容は任意なので、ご自身でお好きなように設定してください。

動かしてみる

起動

まずdocker-compose.ymlがあるdockerディレクトリに移動します。

cd docker

次にコンテナを起動します。

docker-compose up -d

確認

正常に起動しているか確認します。

docker ps

このコマンドを叩いて、NAMESの箇所にdocker-compose.ymlcontainer_name:に定義した名前が表示されていればOKです。
サンプルコード通りに記述している場合、sample-dbと表示されます。

次に起動したコンテナに接続します。
sample-dbの部分はコンテナ名です。

docker exec -it sample-db bash

コンテナ内で動いているDBに接続します。

psql -U postgres -d sample_db

sample_dbはSQLファイル内で作成したDBの名前になります。
SQLファイル内で新たにDBを作成していない場合はpsql -U postgresのみで大丈夫です。

テーブルにデータが挿入されているか見てみます。

SELECT * FROM sample;

SQLファイル内でINSERTしたデータが出力されれば正常に動作しています。

注意点としては初期データを投入するSQL文が間違っていたとき、エラーログなどを出力してくれません。
そのためデータがうまく挿入されないなどの場合、DBに接続した状態で一度直接SQLを流すなどしてSQLの構文が正しいか確認してみるといいと思います。

コンテナの停止と削除

DBやDockerで起動したコンテナに接続している場合、exitを実行することで接続を切ることができます。
/dockerに移動した状態で以下のコマンドを実行することで、コンテナを停止することができます。

docker-compose stop

削除する場合は次のコマンドになります。

docker-compose down

最後までお読みいただきありがとうございました。

18
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
12