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

Docker初始化数据库失败:执行docker-compose up遇连接被拒绝错误

解决Docker Compose中PostgreSQL连接被拒绝的问题

你遇到的panic: dial tcp 172.19.0.2:5432: connect: connection refused错误,大多是因为数据库服务未完全就绪就被请求连接,或者初始化脚本的执行时机有问题,下面是具体的排查和解决步骤:

1. 确保容器启动顺序正确,等待PostgreSQL完全就绪

Docker Compose的depends_on只会保证依赖容器启动,但不会等待服务完全就绪。要解决这个问题,需要给PostgreSQL容器添加健康检查,让应用容器等数据库就绪后再启动:

在你的docker-compose.yml中修改数据库服务配置:

services:
  db:
    build: ./your-dockerfile-path  # 指向你的Dockerfile所在目录
    environment:
      POSTGRES_USER: abc
      POSTGRES_PORT: 5432
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U abc -d postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    expose:
      - "5432"

  # 你的应用服务配置
  app:
    # ... 其他配置
    depends_on:
      db:
        condition: service_healthy  # 等待db容器健康检查通过

2. 修正初始化脚本(initdb.sh)的执行时机

你的Dockerfile把initdb.sh放到了/docker-entrypoint-initdb.d/目录,这个目录的脚本会在PostgreSQL第一次初始化时执行,但此时数据库服务可能还没完全启动。需要在脚本里添加等待逻辑,确保PostgreSQL就绪后再运行Flyway迁移:

修改bin/initdb.sh,在执行Flyway命令前添加:

# 等待PostgreSQL服务就绪
until pg_isready -U "${POSTGRES_USER}"; do
  echo "等待PostgreSQL启动中..."
  sleep 2
done

# 这里再执行你的Flyway迁移命令
# 比如:flyway -configFiles=/docker-entrypoint-initdb.d/flyway.test.conf migrate

3. 检查Flyway配置中的数据库连接地址

如果Flyway是在另一个容器中运行,不要用固定IP(比如172.19.0.2),因为Docker容器IP会随重启变化。应该用Docker Compose中数据库服务的名称(比如db)作为主机名,例如在flyway.test.conf中:

flyway.url=jdbc:postgresql://db:5432/postgres
flyway.user=abc
# 其他配置...

4. 确认PostgreSQL的基础配置正确

确保你的Dockerfile中设置了必要的环境变量,比如如果需要指定数据库名称,添加ENV POSTGRES_DB=your-db-name,这样PostgreSQL初始化时会自动创建该数据库,避免Flyway连接时找不到数据库的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:34:09