使用Docker构建Django+PostgreSQL应用时数据库不存在的问题求助
看起来你遇到的核心问题有两个:一是Django无法连接到docker_db数据库,二是PostgreSQL容器反复报错找不到docker数据库。结合你的配置和日志,我来一步步帮你解决:
1. 彻底清理残留的PostgreSQL数据卷
从日志里的PostgreSQL Database directory appears to contain a database; Skipping initialization可以看出,你的pgdata卷里还残留着旧的数据库数据,导致PostgreSQL跳过了初始化步骤,没有创建你指定的docker_db数据库——哪怕你删除过容器,卷可能也没彻底清理干净。
执行这条命令彻底删除所有关联容器和卷:
docker-compose down -v
这个命令会删除所有服务容器、网络,以及定义的卷(包括pgdata),确保下次启动时PostgreSQL会重新初始化数据库。
2. 修复PostgreSQL的健康检查命令
日志里的FATAL: database "docker" does not exist是因为你的healthcheck命令pg_isready -U docker默认会尝试连接和用户名同名的数据库(也就是docker),但你配置的目标数据库是docker_db。
修改compose.yml里的healthcheck部分:
healthcheck: test: ["CMD-SHELL", "pg_isready -U docker -d docker_db"] interval: 5s timeout: 5s retries: 5
加上-d docker_db指定要检查的数据库,这样就不会再报找不到docker数据库的错误了。
3. 确认Django的数据库配置正确加载
确保你的Django项目的settings.py里正确读取了.env文件中的数据库配置,示例配置如下:
import os DATABASES = { 'default': { 'ENGINE': os.environ.get('SQL_ENGINE', 'django.db.backends.sqlite3'), 'NAME': os.environ.get('SQL_DATABASE', os.path.join(BASE_DIR, 'db.sqlite3')), 'USER': os.environ.get('SQL_USER', 'user'), 'PASSWORD': os.environ.get('SQL_PASSWORD', 'password'), 'HOST': os.environ.get('SQL_HOST', 'localhost'), 'PORT': os.environ.get('SQL_PORT', '5432'), } }
如果你的项目没安装python-dotenv,可以在requirements.txt里加上它(本地开发时需要),不过Docker里通过env_file加载已经足够。
4. 调整Django服务的启动命令
你的back服务命令里同时写了runserver和gunicorn,这会导致只有第一个命令(runserver)执行,第二个永远不会运行。而且建议在启动服务前先执行数据库迁移,避免Django连接数据库时出现迁移相关的问题。
修改compose.yml里的back服务command:
command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
如果是生产环境,换成gunicorn:
command: sh -c "python manage.py migrate && gunicorn blog.wsgi:application -w 2 -b :8000"
最后验证
执行完以上步骤后,重新启动服务:
docker-compose up --build
这次PostgreSQL会重新初始化,创建docker_db数据库,Django也能正常连接了。
内容的提问来源于stack exchange,提问作者Misha




