You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm中Drupal连接PostgreSQL超时问题求助

解决方案

1. 修正数据库服务名拼写错误

你的PostgreSQL服务创建命令里名称是postgress(多了一个s),如果Drupal配置里填写的是正确拼写postgres,会导致无法解析主机。

  • 要么修改Drupal配置中的主机名为postgress
  • 要么删除现有数据库服务,重新创建正确名称的服务:
    docker service rm postgress
    docker service create --name postgres --network my_net -e POSTGRES_PASSWORD=akash postgres
    

2. 验证数据库服务状态

  • 查看服务是否正常运行:
    docker service ls
    
    确保postgres(或postgress)服务的REPLICAS显示为1/1,状态为Running。
  • 查看数据库启动日志,确认没有初始化错误:
    docker service logs postgres  # 或postgress,根据实际服务名
    
    日志中应该出现类似database system is ready to accept connections的提示,说明数据库已就绪。

3. 测试容器间网络连通性

在同一网络下启动临时容器,测试与数据库服务的连通性:

  • 测试ping解析:
    docker run --rm --network my_net busybox ping -c 3 postgres  # 替换为你的数据库服务名
    
  • 测试PostgreSQL端口(5432)是否可访问:
    docker run --rm --network my_net busybox telnet postgres 5432
    
    如果连接成功,说明网络和端口没问题;如果失败,检查网络配置。

4. 确认Docker Swarm网络类型

确保my_net是overlay网络(Swarm服务跨节点通信必须用overlay网络):

docker network inspect my_net

查看输出中Driver字段是否为overlay。如果是bridge网络,仅能在同一节点的容器间通信,若两个服务部署在不同Swarm节点,会导致连接超时。此时需要重新创建overlay网络:

docker network rm my_net
docker network create --driver overlay my_net

之后重新部署两个服务到新网络。

5. 检查Drupal数据库配置细节

确保Drupal配置中的以下参数正确:

  • 主机名:与PostgreSQL服务名完全一致(postgres或postgress)
  • 端口:默认5432(无需修改,除非你自定义了PostgreSQL端口)
  • 数据库名称:默认是postgres(因为你没设置POSTGRES_DB环境变量)
  • 用户名:默认postgres
  • 密码:你设置的akash

6. 处理服务启动顺序问题

PostgreSQL初始化数据库需要时间,若Drupal服务先启动完成,此时数据库还未就绪,会导致连接超时。可以:

  • 手动等待数据库日志显示就绪后,再进行Drupal的数据库配置
  • 给Drupal服务添加健康检查,确保数据库可用后再正常对外提供服务:
    docker service update --health-cmd "pg_isready -h postgres -U postgres" --health-interval 10s --health-retries 3 my_web
    

内容的提问来源于stack exchange,提问作者AKASH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:22:55