3

如果我在文件中创建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;

psql --file但是,如果我在 docker run 命令完成后创建 pg_cron 扩展(即删除上面的最后一行并在完成后单独运行它docker 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'
4

3 回答 3

5

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

注意事项

  1. 脚本执行顺序很重要,并按文件名排序
  2. pg_cron在指定的db中可用cron.database_name
于 2018-08-11T07:36:31.507 回答
0

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

我建议您使用(或至少分叉)这个存储库:ramazanpolat/postgres_cron: Dockerfile 用于构建带有 pg_cron 扩展的 postgresql:11

于 2020-10-14T14:50:28.867 回答
0

建议的解决方案不适用于我新创建的容器。所以,我这样做了:

码头工人文件

FROM postgres:13.2

RUN apt-get update && apt-get -y install git build-essential postgresql-server-dev-13

RUN git clone https://github.com/citusdata/pg_cron.git
RUN cd pg_cron && make && make install

RUN cd / && \
        rm -rf /pg_cron && \
        apt-get remove -y git build-essential postgresql-server-dev-13 && \
        apt-get autoremove --purge -y && \
        apt-get clean && \
        apt-get purge

COPY init-db /docker-entrypoint-initdb.d

init-db/002-pg-cron.sh

#!/usr/bin/env bash

# use same db as the one from env
dbname="$POSTGRES_DB"

# create custom config
customconf=/var/lib/postgresql/data/custom-conf.conf
echo "" > $customconf
echo "shared_preload_libraries = 'pg_cron'" >> $customconf
echo "cron.database_name = '$dbname'" >> $customconf
chown postgres $customconf
chgrp postgres $customconf

# include custom config from main config
conf=/var/lib/postgresql/data/postgresql.conf
found=$(grep "include = '$customconf'" $conf)
if [ -z "$found" ]; then
  echo "include = '$customconf'" >> $conf
fi

此外,您可以将其他初始化文件放入 init-db 目录。

003-main.sql

CREATE EXTENSION pg_cron;

码头工人撰写文件

version: '3.7'
services:
  postgres:
    container_name: your-container
    build: .
    environment:
      POSTGRES_DB: "your_db"
      POSTGRES_USER: "your_user"
      POSTGRES_PASSWORD: "your_user"
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"
volumes:
  pgdata:
    driver: local
于 2021-10-08T11:59:04.130 回答