问题描述
我的 django 应用程序无法连接到 psql 容器,并出现标准连接拒绝错误。我使用了 django-cookiecutter,它通过环境变量自动提供 psql 用户名和密码,然后我收集的这些信息通过托管 DATABASE_URL 字符串的 .env 文件传回 django。
django.db.utils.OperationalError: Could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
当我在 django 设置中设置断点时,我可以看到 DATABASE_URL 似乎被适当地转换为标准的 db dict:
{'NAME': 'hustlestat','USER': 'HjhPLEwuVjUIIKEHebPqNG<redacted>','PASSWORD': 'I43443fR42wRkUaaQ8mkd<redacted>','HOST': 'postgres','PORT': 5432,'ENGINE': 'django.db.backends.postgresql'}
当我使用 psql hustlestat -U HjhPLEwuVjUIIKEHebPqN<redcated>
exec 进入 psql 容器时,我可以使用该用户名连接到数据库。我不是 100% 确定密码,因为当我尝试连接时它不会要求我提供密码。
这是由 cookie cut 自动生成的 docker compose:
version: '3'
volumes:
local_postgres_data: {}
local_postgres_data_backups: {}
services:
django: &django
build:
context: .
dockerfile: ./compose/local/django/Dockerfile
image: hustlestat_local_django
container_name: django
depends_on:
- postgres
- mailhog
volumes:
- .:/app:z
env_file:
- ./.envs/.local/.django
- ./.envs/.local/.postgres
ports:
- "8000:8000"
command: /start
postgres:
build:
context: .
dockerfile: ./compose/production/postgres/Dockerfile
image: hustlestat_production_postgres
container_name: postgres
volumes:
- local_postgres_data:/var/lib/postgresql/data:Z
- local_postgres_data_backups:/backups:z
env_file:
- ./.envs/.local/.postgres
docs:
image: hustlestat_local_docs
container_name: docs
build:
context: .
dockerfile: ./compose/local/docs/Dockerfile
env_file:
- ./.envs/.local/.django
volumes:
- ./docs:/docs:z
- ./config:/app/config:z
- ./hustlestat:/app/hustlestat:z
ports:
- "7000:7000"
command: /start-docs
mailhog:
image: mailhog/mailhog:v1.0.0
container_name: mailhog
ports:
- "8025:8025"
redis:
image: redis:5.0
container_name: redis
celeryworker:
<<: *django
image: hustlestat_local_celeryworker
container_name: celeryworker
depends_on:
- redis
- postgres
- mailhog
ports: []
command: /start-celeryworker
celerybeat:
<<: *django
image: hustlestat_local_celerybeat
container_name: celerybeat
depends_on:
- redis
- postgres
- mailhog
ports: []
command: /start-celerybeat
flower:
<<: *django
image: hustlestat_local_flower
container_name: flower
ports:
- "5555:5555"
command: /start-flower
node:
build:
context: .
dockerfile: ./compose/local/node/Dockerfile
image: hustlestat_local_node
container_name: node
depends_on:
- django
volumes:
- .:/app:z
# http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html
- /app/node_modules
command: npm run dev
ports:
- "3000:3000"
# Expose browsersync UI: https://www.browsersync.io/docs/options/#option-ui
- "3001:3001"
我注意到的唯一奇怪的是,尽管 django 在 docker compose 中被命名,但当我查看正在运行的容器时,它有一个随机名称,例如:
hustlestat_django_run_37888ff2c9ca
不确定这是否相关。
感谢您的帮助!
解决方法
好的已经想通了。我设置了一个 DATABASE_URL 环境变量,因为我最初收到一个错误,说它未设置。谷歌搜索后,我遇到了一个千篇一律的文档,它说要设置它,但没有很好地阅读它以意识到该指令是针对非 docker 设置的。我的是码头工人。
我收到该错误的原因是因为我正在执行容器并运行如下管理命令:
docker exec -it django bash
然后 python manage.py migrate
这个项目的设置方式和环境变量的设置方式,你不能那样做,你必须从exec外部使用这个方法:
docker-compose -f local.yml run --rm django python manage.py migrate
我认为这两种方法可以互换,但事实并非如此。现在一切正常。