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

时间:2018-01-03 00:34:51

标签: postgresql docker psql timescaledb

如果我在docker-entrypoint-initdb.d/init.sql文件中创建了pg_cron扩展程序,则停泊程序图像无法运行,而docker logs <id>只是说&#34;没有这样的容器。&#34;这是相关的.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完成后单独使用docker run运行它),则会成功创建扩展名(postgis)无论如何,时间尺度扩展看起来都很好。

我是否有理由从docker-entrypoint-init.d创建pg_cron扩展名?有正确的地方吗?

我的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'

2 个答案:

答案 0 :(得分:0)

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

真实世界的示例:

002-setup.sh

pg_ctl restart

003-main.sql

#!/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

通知

  1. 脚本执行顺序很重要,并按文件名排序
  2. CREATE EXTENSION pg_cron; 在由pg_cron指定的 db 中可用

答案 1 :(得分:0)

您需要安装和设置pg_cron扩展程序。

我建议您使用(或至少分叉)此存储库:ramazanpolat/postgres_cron: Dockerfile for building postgresql:11 with pg_cron extension