我有一个自定义 DockerFile,它使用我们的软件所需的多个扩展来构建 PostgreSQL。下面是这个 DockerFile 的示例:
FROM postgres:15.4
# Update System
RUN apt-get update
WORKDIR /
#system preloaded libraries
RUN echo "shared_preload_libraries='pglogical,pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
#cron default database
RUN echo "cron.database_name=postgres" >> /usr/share/postgresql/postgresql.conf.sample
上面的“RUN”命令通过添加一些附加参数(如 cron.database_name=postgres)来修补 postgresql.conf.sample 文件,这些参数由 pg_cron 扩展使用来操作。
如果我想让这些参数查看变量,以便能够从 docker-compose 或 kubernetes ConfigMap 更改它,该怎么办?
例如我尝试了这个配置:
FROM postgres:15.4
# Update System
RUN apt-get update
WORKDIR /
#system preloaded libraries
RUN echo "shared_preload_libraries='pglogical,pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
#cron default database
RUN echo "cron.database_name=$CRON_DATABASE_NAME" >> /usr/share/postgresql/postgresql.conf.sample
上面的代码在 postgresql.conf 文件的末尾生成了这一行
cron.database_name=$CRON_DATABASE_NAME
而不是这一行
cron.database_name=postgres
但是 postgres 无法启动,因为它似乎无法将 $CRON_DATABASE_NAME 理解为变量
另一方面,似乎通过设置 WAL_LEVEL 环境变量就可以工作,而无需进入 postgresql.conf,而这个附加参数 cron.database_name 则不是这种情况
有什么想法吗?
我发现只有一些变量可以用作环境变量,这些变量是“postmaster”变量。这些变量在 postgresql 文档中被标记为“postmaster”。
environment:
-pgdata=/var/lib/postgresql/data/pgdata
-wal_level=logical
另一方面,要在 postgresql 启动时设置变量(无论是否为 postmaster),例如调整参数,我们可以使用以下代码,例如 docker compose 或 kubernetes stateful-set 中的参数。
args:
-c cron.database_name=postgres
-c min_wal_size=1GB
-c max_wal_size=4GB
唯一的问题是我们需要重启postgres才能生效。