启动时自定义 pg_hba.conf 的 postgres

postgres with custom pg_hba.conf at startup

我在 docker-容器中使用 postgres14。我希望我的数据库以自定义 pg_hba.conf 开头,所以我创建了自己的 docker 文件,将 1 个文件添加到官方 postgres14 图像:

FROM postgres:14.2
COPY pg_hba.conf /ftool/

现在,在构建上述 docker 文件后,我在容器启动期间遇到以下错误:

initdb: error: directory "/ftool" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/ftool" or run initdb
with an argument other than "/ftool".

如何在数据库初始化之前注入我的 pg_hba.conf?

Docker Hub 上的 Postgres 自述文件对此进行了讨论。您可以创建一个 shell 脚本来完成额外的初始化工作。请参阅下文。

更简单pg_hba.conf

如果你的 pg_hba.conf 很简单,比如

host all all all md5

然后您可以通过为环境变量 POSTGRES_HOST_AUTH_METHOD 指定一个值来采用更简单的方法。它将为您创建一个简单的 pg_hba.conf,使用注明的 auth_method 作为最终字段(上例中的 md5)。

如果您需要比这更复杂的内容,请继续阅读下文。

创建自定义脚本

来自 https://hub.docker.com/_/postgres :

Initialization scripts

If you would like to do additional initialization in an image derived from this one, add one or more *.sql, *.sql.gz, or *.sh scripts under /docker-entrypoint-initdb.d (creating the directory if necessary). After the entrypoint calls initdb to create the default postgres user and database, it will run any *.sql files, run any executable *.sh scripts, and source any non-executable *.sh scripts found in that directory to do further initialization before starting the service.

For example, to add an additional user and database, add the following to /docker-entrypoint-initdb.d/init-user-db.sh:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
  CREATE USER docker;
  CREATE DATABASE docker;
  GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL

因此,要解决您的问题,请将您的 pg_hba.conf 文件复制到 db 目录以外的某个路径,并创建一个类似 /docker-entrypoint-initdb.d/pg_hba_setup.sh 的脚本,将其复制到正确的路径。