Отладчик VSCode с docker-compose

#django #docker #visual-studio-code #docker-compose #vscode-debugger

#django #docker #visual-studio-code #docker-compose #vscode-отладчик

Вопрос:

Недавно я начал использовать docker для своего проекта, работающего со следующим

  • Django
  • Nginx
  • Gunicorn
  • Сельдерей
  • Postgres
  • Redis

Раньше было легко настроить отладчик, но после использования docker-compose я не могу этого сделать. Как только я запускаю отладчик, он загружается на некоторое время, а затем автоматически останавливается без каких-либо журналов или ошибок. Вот соответствующий код.

запустите файл .json

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

docker-compose.yml

 version: '3'

services:
 db:
     image: postgres:12
     env_file: .env
     environment:
        - POSTGRES_DB=${DB_NAME}
        - POSTGRES_USER=${DB_USER}
        - POSTGRES_PASSWORD=${DB_PASSWORD}
    ports:
        - "5431:5432"
    volumes:
        - dbdata:/var/lib/postgresql/data
nginx:
    image: nginx:1.14
    ports:
        - "443:443"
        - "80:80"
    volumes:
        - ./config/nginx/:/etc/nginx/conf.d
        - ./myapp/static:/var/www/myapp.me/static/
web:
    restart: always
    build: ./myapp
    command:  bash -c "
                python manage.py collectstatic --noinput 
                amp;amp; python manage.py makemigrations
                amp;amp; python manage.py migrate
                amp;amp; gunicorn --certfile=/etc/certs/localhost.crt --keyfile=/etc/certs/localhost.key myapp.wsgi:application --bind 0.0.0.0:443 --reload"
    expose:
        - "443"
    depends_on:
        - db
        - nginx
    env_file:
        - .env
    volumes:
        - ./myapp:/opt/myapp
        - ./config/nginx/certs/:/etc/certs
        - ./myapp/static:/var/www/myapp.me/static/

broker:
    image: redis:alpine
    expose: 
        - "6379"

celery:
    build: ./myapp
    command: celery -A myapp worker -l info
    env_file:
        - .env
    volumes:
        - ./myapp:/opt/myapp
    depends_on:
        - broker
        - db

celery-beat:
    build: ./myapp
    command: celery -A myapp beat -l info
    env_file:
        - .env
    volumes:
        - ./myapp:/opt/myapp
    depends_on:
        - broker
        - db

volumes:
    dbdata:
  

Ответ №1:

Наконец мне удалось решить это самостоятельно. Несколько выводов из проблемы.

Вам нужно использовать debugpy и поместить его в свой manage.py файл, чтобы начать прослушивание порта. Я сделал что-то вроде этого

 import debugpy

debugpy.listen(('0.0.0.0', 5678))
debugpy.wait_for_client()
debugpy.breakpoint()
  

Наряду с этим нам нужно сопоставить этот порт с портом внутри хост-машины. Для этого нам нужно изменить и добавить одну строку в веб-службу docker-compose

 ports:
    - "5678:5678"
  

И мой launch.json выглядит так

 {
"configurations": [
    {
        "name": "Python: Remote Attach",
        "type": "python",
        "request": "attach",
        "connect": {
            "host": "0.0.0.0",
            "port": 5678
        },
        "pathMappings": [
            {
                "localRoot": "${workspaceFolder}/myapp",
                "remoteRoot": "."
            }
        ]
    }
]
}
  

ПРИМЕЧАНИЕ: убедитесь, что в вашем файле требований есть debugpy, или установите его вручную.

Комментарии:

1. Спасибо за эту большую помощь, которую вы мне оказали! Я часами пытался получить какую-то рабочую конфигурацию, и ваша просто работает как шарм!

2. Вы только что сохранили мои

Ответ №2:

Если вы сделаете свой отладчик модулем, вы можете включать и выключать его с помощью переменной среды. Я просто использовал эту статью в качестве основы для решения отладки fastapi / gunicorn.

 # debugger.py
from os import getenv

def initialize_flask_server_debugger_if_needed():
    if getenv("DEBUGGER") == "True":
        import multiprocessing

        if multiprocessing.current_process().pid > 1:
            import debugpy

            debugpy.listen(("0.0.0.0", 10001))
            print("⏳ VS Code debugger can now be attached, press F5 in VS Code ⏳", flush=True)
            debugpy.wait_for_client()
            print("� VS Code debugger attached, enjoy debugging �", flush=True)
  

См. Эту статью Адриана: Отладка Flask в VS Code

Комментарии:

1. Спасибо. Это кажется полезным. Попытаюсь получить это в моем проекте.

2. @MrYutz, я и сейчас использую ваше решение, что довольно приятно. Есть только две вещи: 1) Почему вы проверяете pid > 1 ? 2) Если я вызову эту функцию в main () моего manage.py , он будет запускаться несколько раз, сбрасывая отладочный сервер и ожидая нового подключения.

3. @LarsSchellhas — «В режиме отладки Flask использует первый процесс (с pid ==1) для запуска дочерних процессов, которые обрабатывают соединения. Если код под этой строкой выполняется основным процессом, используется порт отладки, и последующие дочерние процессы не могут использовать тот же порт и присваиваются случайный порт, который предотвращает соединения. »

4. Достаточно справедливо. Я использую не flask, а Django, так что, думаю, адаптировать его по-своему нормально 🙂