Docker上でPostgreSQLの拡張機能(pg_cron)を有効化する
先日pg_cronを知りました。で、こいつを開発環境のPostgreSQLに入れようと考えました。正直こいつを開発環境にいれるのは不要だと思いますが、他に開発環境でも使いたい拡張が現れたときに対応できるよう、試しに開発環境で有効化する方法を調べました。まぁあんまり開発環境のDocker上で拡張を有効化している人いませんでしたが。
pg_cronを追加すると仮定すると、下記のようなDockerfileで対応可能です。ちなみに15を使っている理由は開発開始時にAlloyDBが16をサポートしていなかったからです。今は16もサポートしています。
FROM postgres:15
RUN apt-get update && apt-get -y install postgresql-15-cron
COPY ./entrypoint-pg-cron.sql /docker-entrypoint-initdb.d
CMD ["postgres", "-c", "shared_preload_libraries=pg_cron", "-c", "cron.database_name=development"]
同一ディレクトリに下記のファイルを追加します。
CREATE EXTENSION IF NOT EXISTS pg_cron;
docker-comose
を利用する場合も、通常のイメージを置き換える形で問題ないです。
services:
db:
# image: postgres:15
build:
context: .
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: development
ports:
- 5432:5432
volumes:
- db_volume:/var/lib/postgresql/data
Dockerfileについての解説です。
postgresql-15-cron
のインストールは pg_cron
のインストール方法に従っているだけです。ちなみにPostgreSQLのイメージは debian:bookworm-slim
がベースになっているので、Debianベースのインストールです。
/docker-entrypoint-initdb.d
はPostgreSQLのDockerにてデータベースを立ち上げてから実行されるSQLまたはシェルスクリプトを配置するディレクトリです。ここに create extension
をするSQLを配置しています。
注意点として、こちらのスクリプトはすでにデータベースが構築されていると動作しません。永続化しているvolumeなどですでにデータベースが構築されている場合は docker compose down -v
とか docker volume rm
とかで該当のボリュームを削除してください。
最後にCMD
を拡張しています。本来のCMD
はpostgres
1つだけなので、オプションをくっつけたい場合はただ増やせばいいだけです。
confファイルを更新する方法も合ったんですが、ファイルを用意したりする必要があるので見送りました。オプションの内容はセッティングに記載されています。timezoneを指定する場合はここに追加します。
調査の際に参考にしたのは下記の記事です。