PostgreSQL Docker容器端口映射后仍监听5432及健康检查异常
PostgreSQL Docker容器端口与健康检查问题解决
端口异常问题解决
你说test-db指定了5433端口但docker ps还显示5432活跃,大概率是配置没到位:
- 如果是想让容器内部的PostgreSQL直接监听5433端口,别只改ports映射,要在docker-compose.yml的test-db服务里加
command: -p 5433,这会让PostgreSQL启动时用5433端口。同时ports映射写成"5433:5433",这样docker ps里就会显示5433端口的映射。 - 要是只是想把宿主机器的5433端口映射到容器内部默认的5432,那ports配置是
"5433:5432",docker ps显示0.0.0.0:5433->5432/tcp是正常的,这时候容器内部还是用5432,你用宿主的5433访问就行。
健康检查异常修复
pg_isready根本没有小写的-u参数,指定用户得用大写的-U!之前的错误就是因为参数写错了。
另外,直接执行pg_isready会默认用当前用户(root)连接,但PostgreSQL里没有root角色,所以必须指定你创建的inclasstoday用户。
正确的健康检查命令应该是:
pg_isready -U inclasstoday -p 5433
把docker-compose.yml里的healthcheck部分改成这样就行:
healthcheck: test: ["CMD-SHELL", "pg_isready -U inclasstoday -p 5433"] interval: 5s timeout: 5s retries: 5
完整docker-compose示例参考
services: dev-db: image: postgres:15-alpine environment: POSTGRES_USER: inclasstoday POSTGRES_PASSWORD: your_password POSTGRES_DB: dev_db ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U inclasstoday -p 5432"] interval: 5s timeout: 5s retries: 5 test-db: image: postgres:15-alpine environment: POSTGRES_USER: inclasstoday POSTGRES_PASSWORD: your_password POSTGRES_DB: test_db command: -p 5433 # 让容器内部PostgreSQL监听5433端口 ports: - "5433:5433" healthcheck: test: ["CMD-SHELL", "pg_isready -U inclasstoday -p 5433"] interval: 5s timeout: 5s retries: 5
验证方法
- 启动容器后,跑
docker ps,看test-db的端口列是不是显示0.0.0.0:5433->5433/tcp - 进容器执行
pg_isready -U inclasstoday -p 5433,应该返回accepting connections - 用
docker ps看容器状态,健康检查应该显示healthy
内容的提问来源于stack exchange,提问作者Fred Chasin
相关产品推荐
相关产品推荐

