Docker + Django + Postgres Add-on + Heroku

12

我正在进行以下操作:

  • 创建了一个Dockerfile和docker-compose.yml文件来在本地开发django应用程序,这里没有什么要做的,一切都很好。

  • Dockerfile

    FROM python:3
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /code
    WORKDIR /code
    ADD requirements.txt /code/
    RUN pip install -r requirements.txt
    ADD . /code/

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

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

  • 之后,我使用heroku container:push web将应用程序推送到heroku,没有任何问题......

  • 最后一步是当我使用heroku open打开我的应用程序时,它会显示错误:应用程序错误 应用程序发生错误,无法提供页面。如果您是应用程序所有者,请检查日志以获取详细信息。

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

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

我错过了什么?

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

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

编辑2:

在这个官方教程中:https://devcenter.heroku.com/articles/deploying-python,建议使用virtualenv,但我正在使用docker,所以我真不知道该怎么做......

编辑3: 另外,我注意到当我使用命令:heroku container:push web将图像推送到heroku时,服务器会重新部署,但它不会运行procfile上的任何内容,只是记录如下:Starting process with command 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 run web python manage.py runserver 0.0.0.0:5000。我在Heroku上运行Flask和Django遇到了一些问题,所以这个方法适用于我。 - Abe
我们不应该听取$PORT变量吗?难道不应该是0.0.0.0:$PORT,而且我不相信我的procfile会被执行... - Giovanni Klein Campigoto
3个回答

19

由于我没有收到任何答案,我自己回答了这个问题,以便其他人可以使用我的解决方案...

好的,经过大量测试和来来往往,我发现了问题所在。

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

首先:

DATABASES = {}

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

  • 这个DATABASE_URL是一个环境变量,您可以在heroku应用程序中获取它,在heroku仪表板上找到您的应用程序,进入设置,然后Config Variables,点击reveal,您应该得到DATABASE_URL,需要默认变量才能在django上工作/ admin ...(这只是一个解决方法,您应该找到一种从环境变量获取DATABASE_URL的方法)
  • 修改您的Dockerfile以运行命令将django服务器上加入最后一行:CMD python3 manage.py runserver 0.0.0.0:$PORT
  • $PORT 这个变量是由Heroku提供的应用程序端口,因此您的应用程序可以运行。
  • 最后但同样重要的是将您的Heroku应用程序网址添加到ALLOWED_HOSTS中,就像我们的朋友Alejandro Sánchez所说的那样。
  • 这些步骤完成后,您的应用程序应该在Heroku应用程序网址上运行。
  • 编辑1:

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

    编辑2:

    正如用户https://stackoverflow.com/users/1949328/sam所指出的,在生产环境中不应使用runserver命令。请谨慎使用,此命令仅适用于设置一些小型测试项目


    谢谢你。我也遇到了类似的问题,这个对我很有帮助。 - Ryan Skene
    1
    你有没有使用Caddy作为服务器并且可以分享配置文件?我发现在使用Heroku的默认应用程序域名与Caddy的要求相比,很难在生产环境中运行。 - Jay Jung
    1
    你觉得安装django-heroku是必要的吗?这个模块对我来说似乎有问题。 - Jay Jung
    我终于能够仅仅通过你的描述来推送它了。但是我在CMD python3 ...这一行遇到了麻烦。Heroku日志显示python3: can't open file 'manage.py': [Errno 2] No such file or directory。有什么想法吗?我本以为用CMD,我会运行gunicorn。我也尝试过了,但是出现了以下错误:“找不到'app.wsgi'模块”。 - Jay Jung
    兄弟,你真的帮了我让这个东西跑起来,你是真正的MVP。 - Wassaf Shahzad
    显示剩余3条评论

    1
    尝试将Heroku的URL添加到ALLOWED_HOSTS中。

    参考


    那实际上是其中的一部分,可以看看我下面的回答。 - Giovanni Klein Campigoto

    0

    同时,不要忘记在项目的settings.py文件中的ALLOWED_HOST = ['app-name.herokuapp.com']中添加你的应用程序域名:"app-name.herokuapp.com"。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接