• PostgreSQL

    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"]

    同一ディレクトリに下記のファイルを追加します。

    entrypoint-pg-cron.sql
    CREATE EXTENSION IF NOT EXISTS pg_cron;

    docker-comoseを利用する場合も、通常のイメージを置き換える形で問題ないです。

    compose.yml
    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を拡張しています。本来のCMDpostgres1つだけなので、オプションをくっつけたい場合はただ増やせばいいだけです。
    confファイルを更新する方法も合ったんですが、ファイルを用意したりする必要があるので見送りました。オプションの内容はセッティングに記載されています。timezoneを指定する場合はここに追加します。

    調査の際に参考にしたのは下記の記事です。