Heroku 上的 Django 和 Postgresql - 无法将主机名“db”转换为地址:名称或服务未知

2 python django heroku python-3.x docker

我在 Docker 中使用 Angular 4 前端、Django 后端和 Postgresql 数据库在 Heroku 上部署了我的项目。此时我的文件如下所示。当我打开应用程序时,出现错误:

\n\n
2017-07-11T19:51:14.485577+00:00 app[web.1]:     self.connect()\n2017-07-11T19:51:14.485577+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__\n2017-07-11T19:51:14.485578+00:00 app[web.1]:     six.reraise(dj_exc_type, dj_exc_value, traceback)\n2017-07-11T19:51:14.485578+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise\n2017-07-11T19:51:14.485578+00:00 app[web.1]:     raise value.with_traceback(tb)\n2017-07-11T19:51:14.485579+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py", line 213, in ensure_connection\n2017-07-11T19:51:14.485579+00:00 app[web.1]:     self.connect()\n2017-07-11T19:51:14.485579+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py", line 189, in connect\n2017-07-11T19:51:14.485580+00:00 app[web.1]:     self.connection = self.get_new_connection(conn_params)\n2017-07-11T19:51:14.485580+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/postgresql/base.py", line 176, in get_new_connection\n2017-07-11T19:51:14.485580+00:00 app[web.1]:     connection = Database.connect(**conn_params)\n2017-07-11T19:51:14.485581+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect\n2017-07-11T19:51:14.485581+00:00 app[web.1]:     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)\n2017-07-11T19:51:14.485582+00:00 app[web.1]: django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known\n
Run Code Online (Sandbox Code Playgroud)\n\n

本地一切似乎都运行正常。docker exec -ti name /bin/bash然后我使用python {path}\\manage.py migrate并添加数据库。

\n\n

也许我在 Heroku 上的数据库迁移有问题?

\n\n

过程文件:

\n\n
web: sh -c \'cd PROJECT/backend/project && gunicorn project.wsgi --log-file -\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

项目树:

\n\n
DockerProject\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Procfile\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 init.sql\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 PROJECT\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 frontend\n                   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 all files\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 backend\n                  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project\n                        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 prices\n                        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n                        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project\n                              \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 all backend files\n
Run Code Online (Sandbox Code Playgroud)\n\n

前端的 Dockerfile:

\n\n
# Create image based on the official Node 6 image from dockerhub\nFROM node:6\n\n# Create a directory where our app will be placed\nRUN mkdir -p /usr/src/app\n\n# Change directory so that our commands run inside this new directory\nWORKDIR /usr/src/app\n\n# Copy dependency definitions\nCOPY package.json /usr/src/app\n\n# Install dependecies\nRUN npm install\n\n# Get all the code needed to run the app\nCOPY . /usr/src/app\n\n# Expose the port the app runs in\nEXPOSE 4200\n\n# Serve the app\nCMD ["npm", "start"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

主目录的 Dockerfile:

\n\n
FROM python:3.6.1\nENV PYTHONUNBUFFERED 1\nRUN mkdir /code\nWORKDIR /code\nADD requirements.txt /code/\nRUN pip3 install -r requirements.txt\nADD . /code/\n
Run Code Online (Sandbox Code Playgroud)\n\n

docker-compose.yml:

\n\n
version: \'3\'\n\nservices:\n  db:\n    image: postgres\n    environment:\n      POSTGRES_USER: aso\n      POSTGRES_PASSWORD: somepass\n  django:\n    build: .\n    command: python3 MainDirectory/backend/myProject/manage.py runserver 0.0.0.0:8001\n    volumes:\n      - .:/code\n    ports:\n      - "8001:8001"\n    depends_on:\n      - db\n  angular:\n    build: MainDirectory/frontend\n    ports:\n      - "4200:4200"\n    depends_on:\n      - django\n
Run Code Online (Sandbox Code Playgroud)\n\n

初始化.sql:

\n\n
CREATE USER myUser;\nCREATE DATABASE myProject;\nGRANT ALL PRIVILEGES ON DATABASE myProject TO myUser;\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*man 5

db运行 Postgres 的容器仅存在于本地。它没有部署到 Heroku,并且在任何情况下 Heroku 都不支持 docker-compose,因此 Django 容器不知道“db”指的是什么。

您应该使用通过 dj-database-url 覆盖数据库设置的正常模式,以便在生产中您的应用程序使用环境变量中指定的 Postgres 插件。