Docker + Django + Postgres附加组件+ Heroku

时间:2017-09-14 18:14:14

标签: django heroku

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

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

  • Dockerfile

    FROM python:3
    ENV PYTHONUNBUFFERED 1
    运行mkdir /代码
    WORKDIR /代码
    ADD requirements.txt / code /
    RUN 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仓库中克隆我的所有代码:https://github.com/giovanniKleinCampigoto/djangoherokuproblem.git

编辑2:

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

编辑3:  另外,我注意到当我使用以下方法将图像推送到heroku时:heroku容器:推送web,服务器重新部署,但不是运行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"

2 个答案:

答案 0 :(得分:8)

我怎么没找到任何一个回答我正在回答我自己的问题,所以其他人可以使用我的解决方案......

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

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

首先关闭:

  • 关注本地开发的docker官方设置:https://docs.docker.com/compose/django/
  • 然后使用docker-compose up命令服务器应该在端口8000本地运行
  • 完成所有de开发并编写了Dockerfile后,就可以部署它了
  • 请遵循以下指南:https://devcenter.heroku.com/articles/django-app-configuration
  • 请务必在heroku应用
  • 上添加postgres插件
  • 在数据库下的settings.py中,修改为以下内容:DATABASES = {} DATABASES ['default'] = dj_database_url.config(默认='DATABASE_URL')
  • 此DATABASE_URL是一个环境变量,您可以在heroku应用程序中获取,转到heroku上的仪表板,找到您的应用程序,转到设置,配置变量,单击显示,您应该获得DATABASE_URL,默认django work需要/ admin的变量...(这只是一个解决方法,你应该找到一种方法从环境变量中获取DATABASE_URL)
  • 修改您的Dockerfile以运行命令将django服务器添加到最后一行:CMD python3 manage.py runserver 0.0.0.0:$PORT
  • $ PORT变量是heroku提供的应用程序端口,因此您的应用程序可以运行
  • 最后但并非最不重要的是将您的heroku应用网址添加到ALLOWED_HOSTS,正如我们的朋友AlejandroSánchez所说
  • 你是金色的,你的应用程序应该在heroku app url上运行

编辑1:

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

答案 1 :(得分:0)

尝试将heroku网址添加到ALLOWED_HOSTS

Reference