So I'm running through the following:
Created a Dockerfile and a docker-compose.yml to develop a django app locally, nothing to do here, everything works just fine.
Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
All it does is fetches python3 image, copies the code from my source folder to the docker image
Then I'm trying to deploy this to heroku, so I added postgres add-on on heroku apps, and configured it using dj_database_url, with the following command on my settings.py file :
DATABASES = {}
DATABASES['default'] = dj_database_url.config()
After that I pushed my application to heroku using heroku container:push web
and it got pushed to my app no problem at all...
The final piece is when I open my application using heroku open
it says I got an error: 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.
This is what get printed on the heroku website
Now, when I log using heroku logs -t
, it says that exited with code 0, then it crashes
What am I missing?
heroku run web python manage.py migrate
it migrates the data on the heroku appheroku run web python manage.py runserver
it says is running on 127.0.0.1:8000EDIT 1: If you want to reproduce the problem you can clone all my code in the following git repo: https://github.com/giovanniKleinCampigoto/djangoherokuproblem.git
EDIT 2:
In this official tutorial: https://devcenter.heroku.com/articles/deploying-python , says to use virtualenv, but I'm using docker, so I don't really know how to proceed...
EDIT 3:
Also, I noticed that when I push the image to heroku using: heroku container:push web, the server re-deploys, but instead of running whatever is on the procfile it just logs this:
Starting process with command python3
]
EDIT 4:
When running heroku local web
, and editing the Procfile to run docker-compose up
works just fine, the problem is with the upload to heroku's server...not sure if I should edit the file to just 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"
To connect your Django app to your online PostgreSQL server from Heroku, first you need to install a PostgreSQL add-on. First go to your desired app, and click on the “Resources” tab, and inside the search bar, type “postgres”, there should be a Heroku Postgres add-on as a result, and then click it.
With Heroku you have the flexibility of deploying pre-built Docker images via our Container Registry, or building your Dockerfiles on Heroku and taking advantage of Review Apps and Heroku Pipelines.
Since I did not receive any answers to this I'm answering my own question, so others can use my solution...
Ok so after a lot of testing, coming and goings I have discovered the problem.
So what happened was the following: for local development you should use docker-compose, mount volumes and all that yummy stuff, however when going on production with heroku you need to set a command for server starting. So if you ever plan to setup a project with docker + django + postgres add-on on heroku. Do the following steps.
First off:
In settings.py
under databases modify to the following:
DATABASES = {}
DATABASES['default'] = dj_database_url.config(default='DATABASE_URL')
This DATABASE_URL
is a environment variable that you can get in your heroku app, go to your dashboard on heroku, find your app, go to settings, and Config Variables, click on reveal, and you should get the DATABASE_URL
, the default variable is needed to /admin on django work...(This is only a work around, you should find a way to get the DATABASE_URL
from a environment var)
Dockerfile
to run the command to put the django server up adding to the last line: CMD python3 manage.py runserver 0.0.0.0:$PORT
$PORT
variable is the application port provided by heroku, so your application can run ALLOWED_HOSTS
, as our friend Alejandro Sánchez saidEDIT 1:
You don't need gunicorn as a dependency, the only command you should have in your Procfile is: web: python3 manage.py runserver
Try adding the heroku url to ALLOWED_HOSTS
Reference
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With