Docker Compose中Postgres容器始终显示不健康的问题排查
问题描述
我尝试为Docker添加健康检查,参考相关建议后,我的docker-compose配置如下:
version: '3' services: # IMPORTANT NOTE: All other services will share the network on pgadmin service (network_mode: "service:pgadmin"), so ports need to be opened here instead of other the services. pgadmin: container_name: pgadmin image: dpage/pgadmin4 ports: - "6555:80" # pg admin - "6432:6432" # postgres-db environment: PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org PGADMIN_DEFAULT_PASSWORD: admin postgres-db: container_name: test-db image: postgres:14.4 network_mode: "service:pgadmin" command: -p 6432 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: postgres healthcheck: test: ["CMD-SHELL", "pg_isready"] interval: 5s timeout: 5s retries: 3
但Postgres容器被标记为不健康状态:
debrajmanna@debrajmanna-DX6QR261G3 java % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fec13f7d67e3 postgres:14.4 "docker-entrypoint.s…" 17 seconds ago Up 16 seconds (unhealthy) test-db b4042b8e906b dpage/pgadmin4 "/entrypoint.sh" 17 seconds ago Up 16 seconds 443/tcp, 0.0.0.0:6432->6432/tcp, 0.0.0.0:6555->80/tcp pgadmin
请问哪里配置出错了?
问题原因及解决办法
问题出在你指定了Postgres使用自定义端口6432,但pg_isready默认会尝试连接5432端口,导致健康检查无法正常连通数据库,所以容器被标记为不健康。
修改postgres-db服务的健康检查配置,在pg_isready命令里明确指定端口即可:
healthcheck: test: ["CMD-SHELL", "pg_isready -p 6432"] interval: 5s timeout: 5s retries: 3
如果需要更严谨的检查,还可以加上用户名、数据库名参数,确保能正常登录数据库:
healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d postgres -p 6432"] interval: 5s timeout: 5s retries: 3
修改完成后重启容器,健康检查就能正常识别Postgres的运行状态了。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

