Postgres Docker:“postgres:无法访问服务器配置文件”/var/lib/postgresql/data/postgresql.conf“:没有那个文件或目录”

use*_*783 5 postgresql docker

我在使用官方 postgres docker 图像时遇到了奇怪的问题。大多数情况下它工作正常,如果我关闭容器并再次启动它,我有时会收到此错误,但并非每次都这样:

PostgreSQL Database directory appears to contain a database; Skipping initialization

postgres: could not access the server configuration file "/var/lib/postgresql/data/postgresql.conf": No such file or directory

Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令启动 postgres 图像:

 export $(grep -v '^#' .env | xargs) && docker run --rm --name postgres \
  -e POSTGRES_USER=$POSTGRES_USER \
  -e POSTGRES_DB=$POSTGRES_DB \
  -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD \
  -p $POSTGRES_PORT:$POSTGRES_PORT \
  -v $POSTGRES_DEVELOPMENT_DATA:/var/lib/postgresql/data \
  postgres

Run Code Online (Sandbox Code Playgroud)

我将变量保存在.env文件中,它们看起来像这样:

POSTGRES_USER=custom-db
POSTGRES_DB=custom-db
POSTGRES_PASSWORD=12345678
POSTGRES_PORT=5432
POSTGRES_DEVELOPMENT_DATA=/tmp/custom-db-pgdata
Run Code Online (Sandbox Code Playgroud)

当我尝试echo变量时,值就在那里,所以我认为我不会将空值传递给 docker env 变量。

我主机上的目录如下所示:

/tmp/custom-db-pgdata
??? base
?   ??? 1
?   ??? 13407
?   ??? 13408
?   ??? 16384
??? global
??? pg_logical
??? pg_multixact
?   ??? members
?   ??? offsets
??? pg_notify
??? pg_stat
??? pg_stat_tmp
??? pg_subtrans
??? pg_wal
?   ??? archive_status
??? pg_xact
Run Code Online (Sandbox Code Playgroud)

小智 3

如果在同一台计算机和同一会话(也称为不重新启动)上的执行之间工作方式不一致,则某些内容无法正确映射您的目录。找出问题所在会很困难,尤其是在 Mac 上。Mac 上的 Docker 具有通过虚拟机运行的额外好处,因此 docker 将本地驱动器/路径映射到虚拟机,然后将其映射到容器映像中,因此有两个不同的层可能会出现问题。

达里奥(Dario)在他的澄清评论中有正确的想法,你不应该依赖它,/tmp因为这有Mac Magic。实际上/var/private/somegarbagestring,每次启动都是不同的。尝试切换到一个/Users/$USER/dbpath文件夹并将数据移至该文件夹,这样至少您可以在数据和数据库之间少一层魔法进行调试。