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
相关产品推荐
相关产品推荐

