Debug python service in container
rohit sohlot
Posted on May 29, 2022
What if you have a python service (flask, Django,...) running in a docker container and you want to debug the code.
There is a way to do that debugpy
Tools required:
- vs code
- docker
Follow the following steps to debug the code:
- add debugpy to the requirements file
debugpy
-
forward the port for debugging from the docker container
-
If creating a container from Dockerfile then expose the port following way:
https://docs.docker.com/engine/reference/builder/#expose
EXPOSE 10001
-
If using docker-compose then expose the port following way:
version: "3.7" services: python-service: container_name: python-service build: context: . args: DEV: 1 command: sh setup/run-backend-docker.sh --reload restart: on-failure:5 volumes: - ./:/usr/src/app/ - /var/run/docker.sock:/var/run/docker.sock ports: - 10001:10001
Here code will decide in
/usr/src/app/
inside docker container.
-
-
Open the code in vs code and create a folder with name
.vscode
in parent folder. And create the following 2 files inside it.-
launch.json
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { // simple attach to running container - works good "name": "Python Attach", "type": "python", "request": "attach", "port": 10001, "host": "localhost", "pathMappings": [ { "localRoot": "${workspaceFolder}/", "remoteRoot": "/usr/src/app/" } ] } ]
tasks.json
{ "label": "docker-compose-start", "type": "shell", "command": "docker compose -f docker-compose.dev.yml up -d --build -d", "isBackground": true, "problemMatcher": [ { "pattern": [{ "regexp": ".", "file": 1, "location": 2, "message": 3, }], "background": { "activeOnStart": true, "beginsPattern": "^(Building py-service)$", "endsPattern": "^(Creating|Recreating|Starting) (py-container) ... (done)$", } }, ], }
Here we are using docker-compose to create a python service. That's why in the command we specified
docker-compose -f docker-compose.dev.yml up -d --build -d
, if you are using Dockerfile use the following command: docker run —name container_name image_name. -
Now, let's add a listener which will keep track of your button and enables when you will press F5 (in vs code) to debug and attach the debugger.
For that add the following line before our service app
import multiprocessing
if multiprocessing.current_process().pid > 1:
import debugpy
debugpy.listen(("0.0.0.0", 10001))
print("⏳ VS Code debugger can now be attached, press F5 in VS Code ⏳", flush=True)
debugpy.wait_for_client()
print("🎉 VS Code debugger attached, enjoy debugging 🎉", flush=True)
app = create_app()
Reference :
Posted on May 29, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.