启动时自定义 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
的脚本,将其复制到正确的路径。
我在 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
的脚本,将其复制到正确的路径。