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

通过Sqlx连接容器化PostgreSQL时的地址配置问题

解决Docker Compose中API服务无法连接PostgreSQL的问题

核心问题排查与解决步骤

1. 修复Docker Compose配置文件的语法错误

你的docker-compose.yml缺少顶层的services节点,这会导致Docker无法正确识别服务并创建默认共享网络,是服务间无法解析地址的关键原因之一。

正确的配置结构:

services:
  database:
    container_name: postgres-database
    image: postgres
    expose:
      - 5432
    ports:
      - 5432:5432
    restart: always
    environment:
      POSTGRES_PASSWORD: 123
      POSTGRES_DB: users
    volumes:
      - ./init_users.sql:/docker-entrypoint-initdb.d/init.sql
    # 添加健康检查,判断PostgreSQL是否就绪
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d users"]
      interval: 5s
      timeout: 5s
      retries: 5

  auth:
    container_name: auth-service
    build: ./Authentication/
    ports:
      - 8080:8080
    # 依赖database服务,且等待其健康检查通过
    depends_on:
      database:
        condition: service_healthy

2. 确保服务启动顺序正确

Docker Compose默认并行启动所有服务,auth服务可能在PostgreSQL容器完全启动并就绪前就尝试连接,导致地址不可用错误。上面的配置中已经通过depends_on和healthcheck解决了这个问题,确保auth服务仅在数据库就绪后启动。

3. 配置PostgreSQL监听所有地址

默认情况下,PostgreSQL可能只监听localhost,容器内部需要监听0.0.0.0才能让其他容器访问。可以通过以下方式修改:

  • 在database服务的environment中添加:
    environment:
      POSTGRES_PASSWORD: 123
      POSTGRES_DB: users
      POSTGRES_HOST_AUTH_METHOD: trust # 允许所有地址的连接请求
    
  • 或者添加command参数强制监听所有地址:
    command: ["postgres", "-c", "listen_addresses=*"]
    

4. 确认连接字符串正确性

你的连接字符串postgresql://postgres:123@database:5432/users是正确的——Docker Compose默认创建的共享网络中,服务名database可以直接解析为对应容器的IP,无需手动指定IP地址。

额外排查步骤

如果以上操作后仍有问题,可以通过以下命令进一步排查:

  • 查看数据库容器日志,确认PostgreSQL是否正常启动:docker logs postgres-database
  • 进入auth容器,测试能否解析database服务:docker exec -it auth-service ping database
  • 进入auth容器,用psql直接测试连接:docker exec -it auth-service psql -h database -U postgres -d users

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:16:09