В любой более менее большой компании разработчиков вы найдете и человека на "окошках", и трушного линуксоида, и любителя лавандового рафа на альтернативном с яблоком на крышке ноутбука. И если человек с windows с большей вероятностью будет пользоваться WLS (подсистему linux), то вот человек с macOS попробует запустить проект у себя нативно, и это может привести к проблемам с совместимостями некоторых библиотек. Также, учитывая что с высокой долей вероятности ваше приложение будет крутиться в docker контейнере на сервере, не плохо было бы понимать то, как оно работает конкретно в нем. Поэтому зачастую решением которое подойдет всем для корректной разработки приложения без проблем с совместимостью, это запуск и отладка приложения на компьютере разработчики в независимости от установленной ОС прямо в docker. И так я описал мотивацию, перейдем же к настройке вышесказанного.

Для начала необходимо добавить установку библиотеки debugpy для работы отладчика в наше приложение. вы пожете добавить ее в общий фаил requirements.txt или добавить команду DockerFile.

#debugging
RUN /opt/venv/bin/python -m ensurepip --upgrade && \
    /opt/venv/bin/python -m pip install --no-cache-dir debugpy

А также нам нужно поменять команду запуска приложения. Минимальной командой в данном случае будет

/opt/venv/bin/python -Xfrozen_modules=off -m debugpy --listen 0.0.0.0:5678 --wait-for-client main.py

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

Проброс порта прописывается в файле docker-compose:

ports:
      - "5678:5678"

Либо параметром при запуске контейнера

docker run -p 5678:5678 myimage

Далее в команде идет параметр, который обозначает только одно - не запускать приложение до того момента как вы не подключились к контейнеру отладчиком. То есть при запуске контейнера он замрет на ожидании вашего подключения. Сразу после вашего подключения (запуска отладчика) начнется загрузка приложения. Последним параметром - указывается файл запуска.

С настройкой со стороны нашего приложения мы закончили, осталось добавить конфигурацию для самого отладчика.

И далее вводим вот такую конфигурацию

{
    "version": "0.0.1",
    "configurations": [
        {
            "name": "Python Debugger: docker",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "/home/"
                }
            ]
        }
    ]
}

где в connect вы указываем адрес и порт, тот самый который мы пробросили из контейнера к порту, который указывали в команде запуска приложения. Также важно настроить параметр pathMappings - по сути мы просто указываем какая папка проекта локальной машины согласуется с папкой проекта в контейнере. В моем случае указана переменная. Она позволит не указывать точный адрес на локальной машине, прочтет текущую директорию при запуске.

Сохраняем, ставим брек поинты где вам нужно у себя в vsc, запускаем контейнер, отлаживаем приложение.

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

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