Django容器无法与PostgreSQL容器通信,请求排查解决
问题分析与解决方法
核心问题
你的Django数据库配置和docker-compose.yml的服务定义本身是合理的,但错误地将migrate命令放在了Dockerfile的RUN构建步骤中。Docker镜像构建过程是完全独立的:
- 构建阶段不会加入docker-compose创建的网络
- 构建时
db容器根本没有启动,自然无法解析db这个主机名,导致连接失败
解决方法
方法1:将migrate移到容器启动阶段(推荐用启动脚本)
- 在项目根目录创建
start.sh启动脚本:
#!/bin/sh # 等待Postgres就绪(避免容器启动时DB还未初始化完成) until pg_isready -h db -p 5432 -U myuser; do echo "等待Postgres数据库就绪..." sleep 2 done # 执行迁移 python manage.py migrate --settings=eventregistration.settings.development # 启动Django服务 python manage.py runserver 0.0.0.0:8000 --settings=eventregistration.settings.development
- 给脚本添加执行权限:
chmod +x start.sh
- 修改Dockerfile,移除
RUN python manage.py migrate...这一行,替换为:
COPY start.sh /code/start.sh RUN chmod +x /code/start.sh CMD ["/code/start.sh"]
方法2:用docker-compose的command指令直接指定启动命令
不需要修改Dockerfile,直接在docker-compose.yml的django服务中添加command字段:
services: django: build: . ports: - "8000:8000" depends_on: - db command: > sh -c " until pg_isready -h db -p 5432 -U myuser; do echo '等待Postgres就绪...'; sleep 2; done; python manage.py migrate --settings=eventregistration.settings.development; python manage.py runserver 0.0.0.0:8000 --settings=eventregistration.settings.development "
额外注意事项
depends_on仅保证db容器在django容器之前启动,但不保证Postgres服务已经完全初始化完成,添加等待逻辑可以避免偶发的连接失败。- 镜像构建阶段只适合做与镜像本身相关的无依赖操作,比如安装依赖、编译翻译文件、打包静态资源等;数据库迁移、依赖外部服务的操作必须放在容器运行阶段执行。
内容的提问来源于stack exchange,提问作者C4X
相关产品推荐
相关产品推荐

