エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。

【PostgreSQL】Docker環境で任意の設定ファイルを反映する

前提

docker-composeを用いてPostgreSQLの構築をしているとする。(Docker単体でも可)

全体の流れ

  1. 設定ファイルのテンプレを入手する
  2. Dockerイメージを作成するときに、Dockerのリソース内にコピーする(デフォルトで配置されている場所とは異なる場所に配置)
  3. Dockerコンテナ起動時に、上記の設定ファイルを参照するように指定して起動する

この方法については、PostgreSQLの公式Dockerイメージのページに書かれているものである。

参考:Icon in a page linkpostgres - Official Image | Docker Hub

1. 設定ファイルのテンプレを入手する

以下のコマンドで入手することが可能。

今回は ./conf/postgresql.conf という名前でコピーしてきた。

docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > ./conf/postgresql.conf

2. Dockerイメージを作成するときに、Dockerのリソース内にコピーする

FROM postgres:17-alpine AS development

# ここでローカルに配置した「./conf/postgresql.conf」を「/etc/postgresql/postgresql.conf」に配置する
COPY ./conf/postgresql.conf /etc/postgresql/postgresql.conf

EXPOSE 5432

Docker環境を構築してみるとわかるが、
デフォルトの設定ファイルの場所は /var/lib/postgresql/data/postgresql.confである。

上書きしない理由は後述する。

3. Dockerコンテナ起動時に、独自の設定ファイルを参照するように指定する

FROM postgres:17-alpine AS development

# 独自設定ファイルの配置
COPY ./conf/postgresql.conf /etc/postgresql/postgresql.conf

# 「config_file」というオプションを使って、設定ファイルの場所を明示的に指定する
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

EXPOSE 5432

4. docker-compose.ymlを作成

services:
  db:
    container_name: db
    build:
      context: ./db
      dockerfile: Dockerfile
      target: development
    # ホストマシンから直接アクセスできるように設定
    ports:
      - "5432:5432"
    # データベースの内容を永続化する
    volumes:
      - my-postgresql-db:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=Password!
      - POSTGRES_DB=sample
    healthcheck:
      test: "pg_isready -U postgres -d sample"
      interval: 5s
      timeout: 30s
      retries: 5
      start_period: 30s

volumes:
  my-postgresql-db:

デフォルトの設定ファイルを上書きしない理由

今回、わざわざデフォルトとは異なる場所に設定ファイルを配置し、実行コマンドで参照するようにした。

この理由は、上記の docker-compose.ymlを見るとわかる。

PostgreSQLでは

  • データの永続化対象となるディレクトリ: /var/lib/postgresql/data
  • デフォルトの設定ファイルの場所: /var/lib/postgresql/data/postgresql.conf

という構成になっており、 /var/lib/postgresql/dataをマウントしつつ、
その中に含まれている設定ファイルのみをローカル環境からDockerへ送るとなると、煩雑な設定になってしまう。

そのため、設定ファイルを別の場所において、そこを参照するようにするのが一番堅実な手段である。

これは、公式イメージのドキュメントでも同様の作業をしている。

Icon in a page linkpostgres - Official Image | Docker Hub