Как отладить работающий сервис контейнера в VS Code?

Вопросы и ответы

У меня есть контейнеризированная архитектура, где каждая служба работает в другом контейнере, и у меня есть файл Docker Compose для этого. Я хочу отладить одну из этих служб под названием api. Код написан на Python. Я знаю, как подключиться к этому контейнеру, но сталкиваюсь с проблемой при отладке.

Ранее я использовал PyCharm Pro, который имел опцию отладки в Docker Compose, есть ли у VS Code аналогичная функциональность?

Это запущенные службы, для которых я хочу отладить api

Когда я выполняю docker compose down build up, создается целая копия кода и запускается.

Существовали некоторые решения, объясняющие, как я могу добавить debugpy в мой файл, но это не работает для меня, и контейнер API отключается, выдав ошибку:

Debugger warning: It seems that frozen modules are being used, which may
2024-09-16T10:32:29.839664068Z 0.00s - make the debugger miss breakpoints. Please pass -Xfrozen_modules=off
2024-09-16T10:32:29.839666963Z 0.00s - to python to disable frozen modules.

Я не хочу нарушать работу модулей и хочу отладить свою работающую службу с минимальными изменениями, потому что это производственный код. Мне нужен аналог VS Code для отладки в Docker Compose, а затем выбора службы в PyCharm Professional.

Ответ

Чтобы отладить работающий контейнерный сервис в Visual Studio Code (VS Code), следуйте указаниям ниже. Предполагается, что у вас уже есть контейнеризированная архитектура с файлом Docker Compose для ваших контейнеров, и один из сервисов называется api. Для отладки Python-кода в контейнере, вам понадобится сделать некоторые настройки.

1. Установка необходимых расширений в VS Code

Убедитесь, что у вас установлены следующие расширения в VS Code:

  • Python – для работы с Python-кодом.
  • Docker – для работы с контейнерами Docker.

2. Добавление debugpy в ваш код

Чтобы использовать отладчик в Python, вам нужно добавить библиотеку debugpy в ваш проект. Это можно сделать следующим образом:

  1. Если debugpy уже не установлен в вашем контейнере, добавьте его в ваши зависимости. Например, добавьте строку в ваш requirements.txt:

    debugpy
  2. В вашей точке входа приложения (например, app.py) добавьте следующий код для активации отладчика:

    import debugpy
    
    # Установите хост и порт для отладчика (по умолчанию 5678)
    debugpy.listen(('0.0.0.0', 5678))
    print("Ожидание подключения отладчика...")
    debugpy.wait_for_client()  # Опционально, ждёт, пока отладчик подключится

3. Настройка вашего Docker Compose файла

Убедитесь, что ваш docker-compose.yml файл настроен правильно для отладки. Откройте его и убедитесь, что используется правильная версия Python и что порты правильно проксируются:

services:
  api:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"  # Обычно порт вашего приложения
      - "5678:5678"  # Порт для отладчика
    volumes:
      - .:/app  # Монтирование локального кода для отладки

4. Запуск контейнера с отладкой

Запустите ваши контейнеры с помощью команды Docker Compose:

docker-compose up --build

5. Настройка конфигурации отладки в VS Code

  1. Откройте окно "Run and Debug" в VS Code (иконка с треугольником и лампочкой).
  2. Нажмите на ссылку "create a launch.json file" и выберите "Python".
  3. Настройте launch.json, добавив следующую конфигурацию:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "port": 5678,
            "host": "localhost",
            "pathMappings": {
                "/app": "${workspaceFolder}"  // Направляет путь в контейнере на ваш локальный путь
            }
        }
    ]
}

6. Подключение отладчика

Когда ваш API-запуск находится в ожидании подключения отладчика (вы должны увидеть сообщения в терминале), вернитесь в VS Code и выберите конфигурацию "Python: Remote Attach". Нажмите "Start Debugging" (или F5).

Теперь вы должны быть в состоянии ставить точки останова и отслеживать выполнение вашего кода.

Решение проблемы с "frozen modules"

Ошибка, о которой вы упомянули, связано с использованием замороженных модулей в вашем Python-коде. Если вы не хотите изменять ваши модули или устанавливать какие-либо дополнительные параметры при запуске, вам следует оставить эту настройку по умолчанию. Убедитесь, что вы правильно добавили debugpy, и попробуйте отлаживать, как указано выше.

В случае возникновения дополнительных проблем, стоит проверить логи и убедиться, что все зависимости установлены корректно.

В результате, следуя этим шагам, вы сможете отладить свой сервис в работе, используя VS Code, без необходимости вносить значительные изменения в свой код.

Оцените материал
Добавить комментарий

Капча загружается...