DEV Community

Hernán Chilabert
Hernán Chilabert

Posted on

4 1

Enable debugging in a Django project with Docker

Hi! In this post i’m going to show you how to debug your Django code with Docker.

In a Django project with 3 images (django, postgres and redis) you can't debug your code.

Our project run without any issue:

$ docker-compose up
Starting redis_1        ... done
Starting postgres_1     ... done
Starting celeryworker_1 ... done
Starting django_1       ... done
Starting flower_1       ... done
Starting celerybeat_1   ... done
Attaching to redis_1, postgres_1, celerybeat_1, django_1, celeryworker_1, flower_1
...
...
django_1        | Performing system checks...
django_1        |
django_1        | System check identified no issues (0 silenced).
django_1        | August 25, 2019 - 02:29:42
django_1        | Django version 2.0.9, using settings 'config.settings.local'
django_1        | Starting development server at http://0.0.0.0:8000/
django_1        | Quit the server with CONTROL-C.
Enter fullscreen mode Exit fullscreen mode

But, if we put a breakpoint into our code (import pdb; pdb.set_trace()), we get this kind of error:

django_1        | Performing system checks...
django_1        |
django_1        | > /app/config/urls.py(12)<module>()
django_1        | -> path(settings.ADMIN_URL, admin.site.urls),
django_1        | (Pdb)
django_1        | Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f959fef4400>
django_1        | Traceback (most recent call last):
django_1        |   File "/usr/local/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper
...
...
django_1        |   File "/app/config/urls.py", line 12, in <module>
django_1        |     path(settings.ADMIN_URL, admin.site.urls),
django_1        |   File "/app/config/urls.py", line 12, in <module>
django_1        |     path(settings.ADMIN_URL, admin.site.urls),
django_1        |   File "/usr/local/lib/python3.6/bdb.py", line 51, in trace_dispatch
django_1        |     return self.dispatch_line(frame)
django_1        |   File "/usr/local/lib/python3.6/bdb.py", line 70, in dispatch_line
django_1        |     if self.quitting: raise BdbQuit
django_1        | bdb.BdbQuit
Enter fullscreen mode Exit fullscreen mode

What do we have to do to resolve this? We need to run django server in other terminal instance:

These are the steps:

1- Open other terminal instance
2- Run docker-compose ps to view running containers÷

$ docker-compose ps
django_1         /entrypoint /start               Up       0.0.0.0:8000->8000/tcp
postgres_1       docker-entrypoint.sh postgres    Up       5432/tcp
redis_1          docker-entrypoint.sh redis ...   Up       6379/tcp
Enter fullscreen mode Exit fullscreen mode

3- Run docker rm -f django_1 to remove containers
4- Then, run docker-compose run --rm --service-ports django:

$ docker-compose run --rm --service-ports django
Starting postgres_1 ... done
PostgreSQL is available
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
Performing system checks...

System check identified no issues (0 silenced).
August 25, 2019 - 02:54:59
Django version 2.0.9, using settings 'config.settings.local'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C
Enter fullscreen mode Exit fullscreen mode

5- Now, you can put a breakpoint! Save the changes and...

Performing system checks...

> /app/config/urls.py(12)<module>()
-> path(settings.ADMIN_URL, admin.site.urls),
(Pdb)
Enter fullscreen mode Exit fullscreen mode

I hope you find it useful!

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay