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

Django容器无法与PostgreSQL容器通信,请求排查解决

问题分析与解决方法

核心问题

你的Django数据库配置和docker-compose.yml的服务定义本身是合理的,但错误地将migrate命令放在了Dockerfile的RUN构建步骤中。Docker镜像构建过程是完全独立的:

  • 构建阶段不会加入docker-compose创建的网络
  • 构建时db容器根本没有启动,自然无法解析db这个主机名,导致连接失败

解决方法

方法1:将migrate移到容器启动阶段(推荐用启动脚本)

  1. 在项目根目录创建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
  1. 给脚本添加执行权限:
chmod +x start.sh
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:20:06