前提 全体の流れ 1. 設定ファイルのテンプレを入手する 2. Dockerイメージを作成するときに、Dockerのリソース内にコピーする 3. Dockerコンテナ起動時に、独自の設定ファイルを参照するように指定する 4. docker-compose.ymlを作成 デフォルトの設定ファイルを上書きしない理由
前提
docker-composeを用いてPostgreSQLの構築をしているとする。(Docker単体でも可)
全体の流れ
- 設定ファイルのテンプレを入手する
- Dockerイメージを作成するときに、Dockerのリソース内にコピーする(デフォルトで配置されている場所とは異なる場所に配置)
- Dockerコンテナ起動時に、上記の設定ファイルを参照するように指定して起動する
この方法については、PostgreSQLの公式Dockerイメージのページに書かれているものである。
参考:postgres - 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へ送るとなると、煩雑な設定になってしまう。
そのため、設定ファイルを別の場所において、そこを参照するようにするのが一番堅実な手段である。
これは、公式イメージのドキュメントでも同様の作業をしている。