Отладка Python-кода внутри Docker-контейнера

Отладка Python кода внутри Docker контейнера с использованием библиотеки debugpy

Я являюсь большим поклонником микросервисной архитекуры. У такого подхода много премуществ, но в статье речь пойдет не об этом. Итак упаковав на очередном проекте celery-worker в Docker контейнер, Изначально я пробовал более экзотические варианты отладки кода в Docker-контейнерах включая установку расширения dev container от компании, Microdoft. Однако, хотя отладка и заработала данный способ мне не подошел потому то я использовал Docker-compose а в создаваемом расширением контейнере не было «видно» соседних контейнеров.

После недолгих поисков я обнаружил прекрасную статью на английском языке, которая пмне помогла осилить отладку в Docker. Ниже по сути вольный пересказ данной статьи с некоторыми дополнениями.

1. Установка debugpy

Если у нас одиночный Docker контейнер то просто включаем библиотеку в файл requirments.txt

pip instal debugpy
pip freeze > requirments.txt

Если же у вас Docker-compose как у меня то вам нужно создать отдельный файл Dockerfile.dev и конечно же указать к нему путь в ваше docker-compose.dev.yml
в моем случае конфиг был такой.

Также ниже приведу сам Deockerfile.dev в который я добавил команду RUN pip install debugpy

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.10

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# set work directory
WORKDIR /usr/src/project/

# install dependencies
RUN pip install --upgrade pip
RUN pip install debugpy
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# copy project
COPY . .
ENV PYTHONPATH=/usr/src/project

Отлично, библиотеку мы устанвили,теперь осталось ипортировать ее в том модуле который мы хотим отлаживать. У меня это был файл worker.py.

import debugpy
debugpy.listen(("0.0.0.0", 5678))

2. Запуск контейнера

Теперь запустите контейнер и не забудьте пробросить порт:

docker run -p 5678:5678 your_image

Или, если вы используете docker-compose:

version: "3.8"

services:

  worker:
    build:
      context: .
      dockerfile: ./Dockerfile.dev  
    ports:
    - "5678:5678"

version: «3.8»

services:

worker:

build:

context: .

dockerfile: ./Dockerfile.dev

ports:

— «5678:5678»

Откройте vsCode и подключите отладчик

В VS Code нажмите «Выполнить» -> «Добавить конфигурацию» -> «Удаленное подключение», а затем оставьте конфигурацию по умолчанию как локальный хост и порт 5678

Это создает файл launch.json внутри папки .vscode, который указывает отладчику подключиться к порту 5678, где работает удаленный сервер отладки.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "."
                }
            ],
            "justMyCode": true
        }
    ]
}

Теперь вы можете установить точки останова, а затем нажать «Выполнить» -> «Начать отладку», чтобы начать сеанс отладки. Наслаждаться!

Вам также может понравиться

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика