微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

psql django 和 docker 连接被拒绝cookiecutter-django

如何解决psql django 和 docker 连接被拒绝cookiecutter-django

我的 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

我认为这两种方法可以互换,但事实并非如此。现在一切正常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。