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