在 Docker 容器内运行的 Postgres 上安装和使用 pg_cron 扩展

Ste*_*eve 10 postgresql docker docker-compose

我尝试pg_cron在 Docker 容器内运行的 Postgres 上安装,但收到此错误could not access file "pg_cron": No such file or directory。关于如何解决的任何想法?

基于/sf/answers/3625828811/,我尝试了以下方法:

docker-compose.yml

version: '3.7'
services:
  pg:
    container_name: pg-container
    image: postgres:11.5
    environment:
      POSTGRES_DB: "pgdb"
      POSTGRES_USER: "pguser"
      POSTGRES_PASSWORD: "pgpass"
    volumes:
      - ./:/docker-entrypoint-initdb.d
      - pgstorage
    ports:
      - "5432:5432"

volumes:
  pgstorage: 
Run Code Online (Sandbox Code Playgroud)


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'
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)

mad*_*low 5

据我所知,您没有在任何地方安装pg_cron 。由于它没有与默认的 Postgres Docker 映像一起打包,因此您必须注意这一点。

例如,通过扩展图像并build使用docker-compose.yml.

# Dockerfile relative to docker-compose.yml

FROM postgres:11.5

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

RUN git clone https://github.com/citusdata/pg_cron.git
RUN cd pg_cron && make && make install
Run Code Online (Sandbox Code Playgroud)
version: '3.7'
services:
  pg:
    container_name: pg-container
    build: .
    environment:
      POSTGRES_DB: "pgdb"
      POSTGRES_USER: "pguser"
      POSTGRES_PASSWORD: "pgpass"
    volumes:
      - ./:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
Run Code Online (Sandbox Code Playgroud)

在较新版本的 Postgres 中 - 您可以pg_cron使用apt-get.

FROM postgres:16-bookworm
RUN apt-get update &&  \ 
  apt-get -y install postgresql-16-cron && \ 
  apt-get clean \ 
  && rm -rf /var/lib/apt/lists/*
Run Code Online (Sandbox Code Playgroud)

这将处理“安装”部分。还需要配置pg_cron并最终创建扩展。

# add to postgresql.conf

# required to load pg_cron background worker on start-up
shared_preload_libraries = 'pg_cron'

# optionally, specify the database in which the pg_cron background worker should run (defaults to postgres)
cron.database_name = 'postgres'
Run Code Online (Sandbox Code Playgroud)

或者,使用 Docker Compose,这些配置值也可以作为command条目传递:

# Dockerfile relative to docker-compose.yml

FROM postgres:11.5

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

RUN git clone https://github.com/citusdata/pg_cron.git
RUN cd pg_cron && make && make install
Run Code Online (Sandbox Code Playgroud)

最后,您必须创建扩展(在迁移脚本、初始化脚本或其他脚本中)。

version: '3.7'
services:
  pg:
    container_name: pg-container
    build: .
    environment:
      POSTGRES_DB: "pgdb"
      POSTGRES_USER: "pguser"
      POSTGRES_PASSWORD: "pgpass"
    volumes:
      - ./:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
Run Code Online (Sandbox Code Playgroud)

加载扩展并激活它(创建扩展...)可以在 Docker 中通过多种方式完成:https ://hub.docker.com/_/postgres/

这对我有用 - 它可能需要更多优化。