Les Crash-Devs d'un Passionné

Faire du débogage sur un conteneur avec Docker

/Catégorie/python

Temps de lecture : 3 minutes

Nous avons vu dans un précédent article la configuration de base pour faire du débogage dans VSCode avec python

Pour cette fois nous allons rentrer un peu plus en détail sur le débogage d'une application python mais maintenant dans un conteneur docker.

Pour l'exemple suivant nous allons considérer une application web django.

Dans un premier temps nous allons configurer une tasks.json dans le dossier .vscode de votre projet

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "docker-build",
            "label": "docker-build",
            "platform": "python",
            "dockerBuild": {
                "tag": "myApp:latest",
                "dockerfile": "${workspaceFolder}/app/Dockerfile",
                "context": "${workspaceFolder}/app",
                "pull": true
            }
        },
        {
            "type": "docker-run",
            "label": "docker-run: debug",
            "dependsOn": [
                "docker-build"
            ],
            "python": {
                "file": "manage.py",
                "args": [
                    "runserver",
                    "0.0.0.0:8000"
                ],
            },
            "dockerRun": {
             "ports": [
                    {
                        "hostPort": 8000,
                        "containerPort": 8000
                    }
                ],
                "volumes": [
                    {
                        "containerPath": "/usr/src/app",
                        "localPath": "${workspaceFolder}/app"
                    }
                ],
                "envFiles": [
                    ".env"
                ]
            }
        }
    ]
}

La tâche docker-build permet de build le conteneur déclaré dans tag avec son Dockerfile associé.

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
FROM python:3.7

ENV PYTHONUNBUFFERED 1

RUN mkdir /usr/src/app

WORKDIR /usr/src/app
ADD Pipfile /usr/src/app/

RUN apt-get clean 
RUN apt-get update 
RUN apt-get install gettext -y

RUN pip install pipenv
RUN cd /usr/src/app && pipenv lock 
RUN pipenv install --dev --deploy --system

ADD . /usr/src/app/

ENTRYPOINT [ "/bin/bash", "./start-dev.sh" ]

La tâche docker-run est présent pour lancer le conteneur précédemment buildé. Il exécute la commande placée dans args

python manage.py runserver 0.0.0.0:8000

permettant de lancer le serveur. La configuration dockerRun correspond aux paramètres de votre conteneur, qui dépendra de ce que vous avez mis dans votre Dockerfile.

La documentation officielle vous donnera des informations complémentaires sur la configuration du build et du run.

À cette étape vous êtes prêt pour lancer le débogage.

Maintenant il est nécessaire de créer un launch.json dans .vscode afin de configurer le débogage via VSCode. La documentation officielle vous donnera des informations complémentaires.

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
    "configurations": [
        {
            "name": "Docker: Python - Django",
            "type": "docker",
            "request": "launch",
            "preLaunchTask": "docker-run: debug",
            "debugAdapterHost": "172.17.0.1",
            "python": {
                "pathMappings": [
                    {
                        "localRoot": "${workspaceFolder}/app",
                        "remoteRoot": "/usr/src/app"
                    }
                ],
                "projectType": "django",
                "django": true,
            },
        }
    ]
}

Important, si vous êtes sous Linux il est obligatoire de rajouter debugAdapterHost sinon votre point d'arrêt ne sera pas vu (issue ouverte à ce jour).

La valeur a indiqué dans ce champ est le résultat de cette commande

docker inspect bridge --format="{{(index .IPAM.Config 0).Gateway}}"

Si vous utilisez un docker-compose vous devez lancer vos autres dépendances en faisant un clic droit sur ce fichier Compose Up. Pensez à éteindre le conteneur que vous avez précédemment configuré avec VSCode car c'est celui-ci que vous cherchez à analyser.

Dans la configuration de votre application si vous cherchez, comme dans l'exemple, à joindre la base de données pensez à remplacer l'IP par celle de la gateway docker.

Il vous reste à placer un point d'arrêt et d'aller dans l'onglet Run de VSCode