Я являюсь большим поклонником микросервисной архитекуры. У такого подхода много премуществ, но в статье речь пойдет не об этом. Итак упаковав на очередном проекте 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 } ] }
Теперь вы можете установить точки останова, а затем нажать «Выполнить» -> «Начать отладку», чтобы начать сеанс отладки. Наслаждаться!