【问题标题】:Docker + Django + Postgres Add-on + HerokuDocker + Django + Postgres 附加组件 + Heroku
【发布时间】:2018-02-23 19:59:53
【问题描述】:

所以我正在执行以下操作:

  • 创建了一个 Dockerfile 和一个 docker-compose.yml 来在本地开发一个 django 应用,这里什么都不做,一切正常。

  • Dockerfile

    来自 python:3
    环境 Python 无缓冲 1
    运行 mkdir /code
    WORKDIR /代码
    添加 requirements.txt /code/
    运行 pip install -r requirements.txt
    添加 。 /代码/

  • 它所做的只是获取 python3 图像,将代码从我的源文件夹复制到 docker 图像

  • 然后我尝试将其部署到 heroku,因此我在 heroku 应用程序上添加了 postgres 插件,并使用 dj_database_url 对其进行配置,并在我的 settings.py 文件中使用以下命令: DATABASES = {} DATABASES['default'] = dj_database_url.config()

  • 之后,我使用 heroku container:push web 将我的应用程序推送到 heroku,它被推送到我的应用程序完全没有问题...

  • 最后一点是当我使用 heroku open 打开我的应用程序时,它说我遇到了错误:Application error An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details.

  • 这是打印在 heroku 网站上的内容

  • 现在,当我使用 heroku logs -t 登录时,它说以代码 0 退出,然后崩溃

我错过了什么?

  • 另外:当我运行 heroku run web python manage.py migrate 时,它会迁移 heroku 应用程序上的数据
  • Plus 2:当我运行 heroku run web python manage.py runserver 时,它说正在 127.0.0.1:8000 上运行

编辑 1: 如果您想重现该问题,您可以在以下 git repo 中克隆我的所有代码:https://github.com/giovanniKleinCampigoto/djangoherokuproblem.git

编辑 2:

在这个官方教程中:https://devcenter.heroku.com/articles/deploying-python,说要使用 virtualenv,但我使用的是 docker,所以我真的不知道如何进行......

编辑 3: 另外,我注意到,当我使用 heroku container:push web 将图像推送到 heroku 时,服务器会重新部署,但不会运行 procfile 上的任何内容,它只会记录以下内容: 使用命令python3启动进程]

编辑 4: 运行heroku local web 并编辑Procfile 以运行docker-compose up 工作正常,问题在于上传到heroku 的服务器...不确定我是否应该将文件编辑为python manage.py runserver...

docker-compose.yml

version: '2'

services:
  web:
    build: .
    env_file: composeexample/.env
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"

【问题讨论】:

  • 尝试在您的ProcFile 中将heroku 上正在运行的服务器更改为heroku run web python manage.py runserver 0.0.0.0:5000。我在 heroku 上运行烧瓶和 django 时遇到了一些问题,所以,这对我有用。
  • 我们不应该听 $PORT 变量吗?难道不是 0.0.0.0:$PORT,而且我不相信我的 procfile get 曾经被执行过......

标签: django heroku


【解决方案1】:

由于我没有收到任何答案,因此我正在回答我自己的问题,因此其他人可以使用我的解决方案...

好的,经过大量的测试,来来去去我发现了问题。

所以发生的情况如下:对于本地开发,您应该使用 docker-compose、挂载卷和所有美味的东西,但是当使用 heroku 进行生产时,您需要设置一个服务器启动命令。因此,如果您打算在 heroku 上使用 docker + django + postgres 附加组件设置项目。执行以下步骤。

首先:

  • 按照docker官方设置进行本地开发:https://docs.docker.com/compose/django/
  • 然后使用 docker-compose up 命令服务器应该在 8000 端口本地运行
  • 完成所有开发并编写 Dockerfile 后,就可以部署它了
  • 按照本指南:https://devcenter.heroku.com/articles/django-app-configuration
  • 请务必在您的 Heroku 应用中添加 postgres 插件
  • settings.py下的数据库中修改如下:

    DATABASES = {}

    DATABASES['default'] = dj_database_url.config(default='DATABASE_URL')

  • 这个DATABASE_URL是一个环境变量,你可以在你的heroku应用程序中获取它,进入你的heroku仪表板,找到你的应用程序,进入设置和配置变量,点击显示,你应该得到DATABASE_URL,在 django 上运行 /admin 需要默认变量...(这只是一种解决方法,您应该找到一种从环境变量中获取 DATABASE_URL 的方法)

  • 修改您的Dockerfile 以运行命令将django 服务器添加到最后一行:CMD python3 manage.py runserver 0.0.0.0:$PORT
  • $PORT变量是heroku提供的应用端口,所以你的应用可以运行
  • 最后但同样重要的是,正如我们的朋友 Alejandro Sánchez 所说,将您的 heroku 应用网址添加到 ALLOWED_HOSTS
  • 你是金子,你的应用程序应该在 heroku 应用程序 url 上运行

编辑 1:

您不需要 gunicorn 作为依赖项,您的 Procfile 中应该有的唯一命令是:web: python3 manage.py runserver

【讨论】:

  • 感谢您。我也遇到了类似的情况,发现这很有帮助。
  • 您有没有机会使用 Caddy 作为服务器并可以共享配置?发现使用 heroku 的默认应用程序域与 caddy 的要求很难运行生产
  • 你觉得安装 django-heroku 有必要吗?模块本身似乎对我来说坏了。
  • 不,我用过 docker,关于 caddy 我无法回答,因为我对此一无所知。
  • 多亏了你的描述,我终于只能推送它了。但我遇到了CMD python3 ... 行的问题。 Heroku 日志说 python3: can't open file 'manage.py': [Errno 2] No such file or directory。任何想法?我会想用 CMD,我会运行 gunicorn。我也试过了,但是下面的“app.wsgi”“找不到模块”..
【解决方案2】:

尝试将heroku url添加到ALLOWED_HOSTS

Reference

【讨论】:

  • 这实际上是其中的一部分,请参阅下面的答案
猜你喜欢
  • 2017-05-30
  • 2014-12-14
  • 1970-01-01
  • 2013-05-01
  • 2012-10-15
  • 2015-08-22
  • 2021-07-21
  • 2019-08-05
  • 2021-04-24
相关资源
最近更新 更多