我正在开发一个使用 postgres 数据库的应用程序。我使用
docker-compose
在容器中运行所有内容。
我的撰写文件如下所示:
version: '3.8'
services:
backend:
... # Backend stuff, runs fine
depends_on:
- db
frontend:
... #Frontend stuff, runs fine
db:
image: postgres
volumes:
- ./db/data:/var/lib/postgressql/data
ports:
- 5432:5432
environment:
- POSTGRES_PASSWORD=*********** #This is a proper password
healthcheck:
test: ["CMD","pg_isready", "-d", "postgres", "-h", "localhost", "-p 5432", "-U postgres"]
interval: 10s
timeout: 30s
retries: 5
start_period: 30s
一切正常并运行良好,但是,我的数据库容器不断打印出此错误消息:
FATAL: role " postgres" does not exist
我没有指定任何用户,因此根据我的理解,在构建映像时应该创建默认角色“postgres”。
我也看到很多人在他们的系统上运行其他 postgres 数据库时遇到这个问题,但对我来说情况并非如此。
PS.
我的后端是使用 FastAPI 和 SQLAlchemy 以及 psycopg 用 python 编写的。 它使用 URL
'postgresql+psycopg://postgres:DBPASSWORD@db:5432'
连接到数据库
db-data
而不是替代方案 bind mount
。如果您仍然喜欢 bind mount
,请将拼写错误 postgressql
修正为 postgresql
。localhost
解析为正确的容器 IP。对于这种情况,请删除 localhost
并添加 db
。通过此更改,-h db
告诉 PostgreSQL 连接到您的撰写文件中定义的名为 db
的服务。version: '3.8'
services:
backend:
... # Backend stuff, runs fine
depends_on:
- db
frontend:
... #Frontend stuff, runs fine
db:
image: postgres
volumes:
# - ./db/data:/var/lib/postgresql/data
- db-data:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=*********** #This is a proper password
- POSTGRES_DB=postgres
healthcheck:
test:
[
"CMD",
"pg_isready",
"-d",
"postgres",
"-h",
# "localhost",
"db",
"-p 5432",
"-U postgres",
]
interval: 10s
timeout: 30s
retries: 5
start_period: 30s
volumes:
db-data: