Отладка службы python в контейнере

Что если у вас есть python-сервис (flask, Django,…), запущенный в контейнере docker, и вы хотите отладить его код.

Есть способ сделать это debugpy.

Необходимые инструменты:

  1. vs код
  2. docker

Выполните следующие шаги для отладки кода:

  1. добавьте debugpy в файл требований
debugpy
Войдите в полноэкранный режим выйти из полноэкранного режима
  1. перенаправить порт для отладки из контейнера docker

    1. Если вы создаете контейнер из Dockerfile, то пробросьте порт следующим образом:
      https://docs.docker.com/engine/reference/builder/#expose

      
      EXPOSE 10001
      
      
    2. Если используется docker-compose, то пробросьте порт следующим образом:

      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
      

      Здесь код будет решаться в /usr/src/app/ внутри контейнера docker.

  2. Откройте код в vs code и создайте папку с именем .vscode в родительской папке. И создайте в ней следующие 2 файла.

    1. 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/"
                      }
                  ]
              }
          ]
      
      
    2. 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)$",
            }
          },
        ],
      }
    

    Здесь мы используем docker-compose для создания python-сервиса. Поэтому в команде мы указали docker-compose -f docker-compose.dev.yml up -d --build -d, если вы используете Dockerfile, используйте следующую команду: docker run -name container_name image_name.

    Ссылка: https://docs.docker.com/engine/reference/run/

  3. Теперь давайте добавим слушатель, который будет отслеживать нажатие кнопки и позволит вам нажать F5 (в коде vs) для отладки и подключить отладчик.

    Для этого добавьте следующую строку перед нашим сервисным приложением

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()
Войти в полноэкранный режим Выйти из полноэкранного режима

Ссылка

  1. отладка flask
  2. отладка flask в docker-compose

Оцените статью
Procodings.ru
Добавить комментарий