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

2024-02-04

如果我创建pg_cron https://github.com/citusdata/pg_cron扩展在一个docker-entrypoint-initdb.d/init.sql文件,docker镜像无法运行并且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;

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

我无法创建 pg_cron 扩展是否有原因docker-entrypoint-init.d?有正确的地方吗?

我的docker运行命令如下:

 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'

pg_cron只能作为共享库加载。您必须在中指定它postgres.conf文件。由于所有脚本都在docker-entrypoint-init.d在 postgres 服务器启动后执行(使用pg_ctl start),所有更改为shared_preload_libraries in 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

003-main.sql:

CREATE EXTENSION pg_cron;

Notice:

  1. 脚本执行顺序很重要,并且按文件名排序
  2. pg_cron可用于db指定为cron.database_name
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 docker-entrypoint-initdb.d 中创建 pg_cron 扩展失败 的相关文章

随机推荐