在 docker-entrypoint-initdb.d 中创建 pg_cron 扩展失败

Ale*_*ung 3 postgresql psql docker timescaledb

如果我在文件中创建pg_cron扩展名,则dockerdocker-entrypoint-initdb.d/init.sql映像将无法运行,docker logs <id>只会显示“没有这样的容器”。这是相关的 .sql 片段:

CREATE DATABASE my_database;
\c my_database;
CREATE EXTENSION IF NOT EXISTS postgis CASCADE;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
CREATE EXTENSION IF NOT EXISTS pg_cron CASCADE;
Run Code Online (Sandbox Code Playgroud)

但是,如果我在 docker run 命令完成后创建 pg_cron 扩展(即删除上面的最后一行并psql --filedocker run完成后单独运行它),扩展将成功创建(无论如何,postgis 和 timescaledb 扩展似乎都很好)。

有什么原因我不能创建 pg_cron 扩展docker-entrypoint-init.d吗?有正确的地方吗?

我的 docker run 命令如下:

 docker run -d \
        --name my_container --rm \
        -p 5432:5432 \
        -clog_line_prefix="%m [%p]: [%l-1] %u@%d" \
        -clog_error_verbosity=VERBOSE \
        -cshared_preload_libraries='timescaledb,pg_cron' \
        -ccron.database_name='my_database'
Run Code Online (Sandbox Code Playgroud)

小智 5

pg_cron只能作为共享库加载。您必须在postgres.conf文件中指定它。由于所有脚本 indocker-entrypoint-init.d都是在 postgres 服务器启动(使用pg_ctl start)之后执行的,因此所有对shared_preload_librariesin 的更改postgres.conf都可以在重新启动(使用pg_ctl restart)后变得可用。

现实世界的例子:

002-setup.sh

#!/bin/sh

# Remove last line "shared_preload_libraries='citus'"
sed -i '$ d' ${PGDATA}/postgresql.conf

cat <<EOT >> ${PGDATA}/postgresql.conf
shared_preload_libraries='pg_cron,citus'
cron.database_name='${POSTGRES_DB:-postgres}'
EOT

# Required to load pg_cron
pg_ctl restart
Run Code Online (Sandbox Code Playgroud)

003-main.sql :

CREATE EXTENSION pg_cron;
Run Code Online (Sandbox Code Playgroud)

注意

  1. 脚本执行顺序很重要,按文件名排序
  2. pg_cron在指定的数据库中可用cron.database_name

  • 这还不够,您实际上需要先安装扩展,然后才能在 PostgreSQL 配置中引用它 (2认同)