Docker-Compose容器均报“Waiting for PostgreSQL to become available...”求助
排查步骤
1. 测试容器间网络连通性
从卡住等待的容器(如web或worker)内部ping PostgreSQL服务名,确认网络可达:
docker exec -it <web-container-name> ping postgres
若不通,检查docker-compose.yml中网络配置,确保所有容器归属同一自定义网络(课程示例通常会定义)。
2. 验证PostgreSQL实际可连接状态
直接在PostgreSQL容器内用psql测试本地连接:
docker exec -it <postgres-container-name> psql -U <db-user> -d <db-name>
若连接失败,查看PostgreSQL初始化日志,排查数据库创建、用户权限等问题。
3. 检查等待脚本有效性
课程中的等待脚本(如wait-for-postgres.sh)可能存在配置不匹配:
- 核对脚本内
DB_HOST、DB_PORT、DB_USER与docker-compose.yml中的参数是否一致 - 手动在web容器内运行脚本,查看具体错误:
docker exec -it <web-container-name> ./wait-for-postgres.sh
4. 确认端口映射配置
检查docker-compose.yml中的端口映射规则:
- Django服务:确保配置类似
ports: - "8010:8000"(对应课程内的端口设定) - Flower服务:确保配置类似
ports: - "5557:5555"
用以下命令验证实际映射端口:
docker port <container-name>
5. 跳过等待脚本直接测试服务启动
临时修改web容器启动命令,跳过等待脚本直接启动Django,判断是脚本问题还是数据库连接问题:
docker-compose run --rm web python manage.py runserver 0.0.0.0:8000
若能启动,说明等待脚本存在故障;若仍连接失败,检查Djangosettings.py中的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': 'postgres', 'PORT': 5432, } }
确认环境变量是否正确传递给容器。
6. 排查本地端口占用
检查本地8010/5557端口是否被其他程序占用:
# Linux/macOS lsof -i :8010 lsof -i :5557 # Windows netstat -ano | findstr :8010
若端口被占用,停止对应程序或修改docker-compose.yml中的端口映射规则。
内容的提问来源于stack exchange,提问作者Shreyas Somashekara
相关产品推荐
相关产品推荐

