1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PostgreSQL】Dockerコンテナビルド時にpostgresql.confの設定を反映する

Last updated at Posted at 2024-10-30

概要

PostgreSQLのDockerコンテナビルド時に、postgresql.confをホストから送り込んで初期設定値を変更する方法を記載します。

confファイルによってDBの設定値を変更したいときに使います。今回は事例として以下3点を変更しますが、お手元で設定変更したい内容にしたがって、読み換えてください。

  • max_connections
  • max_wal_size
  • timezone
項目 内容
取り扱う内容 ・ PostgreSQLのDockerコンテナビルド時の設定カスタマイズ方法
・ postgresql.confファイルを使用した設定値の変更手順
・ 変更した設定値が有効になっていることを確認する方法
想定読者 ・ PostgreSQLをDockerで運用しようとしている人
・ Dockerの基本的な知識を持っている人
・ PostgreSQLの設定をカスタマイズする必要がある人
ゴール ・ PostgreSQLコンテナの設定値を初期値から変更する方法の理解

ホストのディレクトリ構成

本記事では、以下の構成でファイルが配置されている前提で構築を進めていきます。もちろん、細かいファイルの配置はプロジェクトの方針にしたがって変更してよいです。

postgres/
├── docker-compose.yml
├── Dockerfile
└── config/
    └── postgresql.conf

まずはconfの設定を反映しないでコンテナを起動し、初期値を確認する

コンテナ内のpostgresql.confを直接読めば初期値はわかるんですが、予行演習としてやっておきます。

設定ファイルの作成・記載

まずはdocker-compose.ymlDockerfileを以下の通り記載します。

docker-compose.yml

version: '3.8' # 最新のDocker composeではバージョン自動判定されるので要らない

services:
  db:
    build: . # Dockerfileがあるディレクトリを指定 今回はカレントディレクトリ
    environment:
      POSTGRES_DB: testdb
      POSTGRES_USER: testuser
      POSTGRES_PASSWORD: testpass
    ports:
      - "5435:5432" # ホストで使用しているポートに重複しないよう、左辺を適宜変更
    volumes: # データの永続化が必要ならvolumeを定義する
    - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Dockerfile

FROM postgres:15 # バージョンは適宜、お好きなものへ変更

コンテナ起動

ホストにて、以下のコマンドを実行します。コンテナがビルド・起動されます。

docker-compose up --build -d

DBの設定値を確認

ホストにて以下のコマンドを実行します。もちろん、コンテナにアタッチしてコンテナ内でpsql以降を実行したり、外部のDB管理ツールからダブルクォート内のSQLを投げてもOK。とにかくこれによって、今回変更するDB設定の初期値がわかりましたね。

# psqlコマンドをdbコンテナで実行する
docker-compose exec db psql -U testuser -d testdb -c "SHOW max_connections; SHOW max_wal_size; SHOW timezone;"

実行結果:

 max_connections 
-----------------
 100
(1 row)

 max_wal_size 
--------------
 1GB
(1 row)

 TimeZone 
----------
 Etc/UTC
(1 row)

confファイルの設定を反映してコンテナを起動する

前項で確認した3つの設定値を、confファイルによってコンテナビルド時点で変更していきます。

設定ファイルの編集・追加

docker-compose.ymlは前項と同様でOK。dockerfileの編集と、confファイルの作成・記載を行います。

Dockerfile

FROM postgres:15

# postgresql.confをコンテナ内にコピー
COPY config/postgresql.conf /etc/postgresql/postgresql.conf

# 設定ファイルの場所を指定して起動するようにCMDを上書き
# docker-compose.ymlで別のcommandを書いていると、そちらが優先されてしまうので注意
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

config/postgresql.conf

max_connections = 200
max_wal_size = 2GB
timezone = 'Asia/Tokyo'

DockerfileのCOPY先ディレクトリについて:
Dockerfileにおいて、confファイルの送り先をPostgreSQLのデフォルトconfファイルパスである/var/lib/postgresql/data/postgresql.conf ではなく、/etc/postgresql/postgresql.confへのCOPYとしています。これは、以下の理由によります。

  • デフォルトの設定ファイルを上書きしないようにするため
  • docker-compose.ymlでvolumesマウントしているので、COPYした内容が永続化ボリュームによって上書きされる可能性があるため

コンテナ起動

ホストにて、以下のコマンドを実行します。コンテナがビルド・起動されます。

# docker-compose up -d ではコンテナがビルドされない = 設定反映されないので、--buildをつける
docker-compose up --build -d

DBの設定値を確認

ホストにて以下のコマンドを実行します。confファイルに記載した設定でコンテナが稼働していることが分かります。

# psqlコマンドをdbコンテナで実行する
docker-compose exec db psql -U testuser -d testdb -c "SHOW max_connections; SHOW max_wal_size; SHOW timezone;"

実行結果:

 max_connections 
-----------------
 200
(1 row)

 max_wal_size 
--------------
 2GB
(1 row)

  TimeZone  
------------
 Asia/Tokyo
(1 row)

以上です! 大きいデータを扱う際は、PostgreSQLの初期値では心許ない場面も多いので、この方法で設定値を変えながら色々遊んでみましょう。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?