ptvsd: сигнал работает только в основном потоке. Попытка настроить отладку vscode приложения Flask в контейнере Docker - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь настроить отладчик для dockerized Flask приложения на VSCode. Для этого я подключил ptvsd к своему приложению и открыл его порт.

from flask import Flask, redirect, url_for
app = Flask(__name__)

if app.debug:
   print("attaching ptvsd")
   import ptvsd
   ptvsd.enable_attach(address = ('0.0.0.0', 3000), redirect_output=True)
   ptvsd.wait_for_attach()
   ptvsd.break_into_debugger()

Dockerfile

FROM python:3

ENV FLASK_APP app/main.py

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "flask", "run", "--host=0.0.0.0" ]

И команда, используемая для запуска контейнера:

docker run -it --rm -p 5000:5000 -p 3000:3000 -e FLASK_ENV=development webserver

Ошибка по умолчанию не отображается после запуска контейнера. Когда я пытаюсь подключить отладчик из vscode на порт 3000, ничего не происходит. Когда я открываю любую страницу своего приложения в веб-браузере, появляется следующее сообщение:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/src/app/app/main.py", line 9, in <module>
    ptvsd.enable_attach(address = ('0.0.0.0', 3000), redirect_output=True)
  File "/usr/local/lib/python3.7/site-packages/ptvsd/attach_server.py", line 101, in enable_attach
    ptvsd_enable_attach(address)
  File "/usr/local/lib/python3.7/site-packages/ptvsd/_remote.py", line 64, in enable_attach
    **kwargs)
  File "/usr/local/lib/python3.7/site-packages/ptvsd/pydevd_hooks.py", line 128, in install
    daemon = Daemon(**kwargs)
  File "/usr/local/lib/python3.7/site-packages/ptvsd/daemon.py", line 503, in __init__
    super(Daemon, self).__init__(wait_for_user, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/ptvsd/daemon.py", line 100, in __init__
    self._install_exit_handlers()
  File "/usr/local/lib/python3.7/site-packages/ptvsd/daemon.py", line 425, in _install_exit_handlers
    self._exithandlers.install()
  File "/usr/local/lib/python3.7/site-packages/ptvsd/exit_handlers.py", line 62, in install
    self._install_signal_handler()
  File "/usr/local/lib/python3.7/site-packages/ptvsd/exit_handlers.py", line 103, in _install_signal_handler
    orig[sig] = signal.signal(sig, self._signal_handler)
  File "/usr/local/lib/python3.7/signal.py", line 47, in signal
    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread

Может ли кто-нибудь объяснить мне значение сообщения об ошибке? Что можно исправить для этой проблемы?

1 Ответ

0 голосов
/ 02 февраля 2020

Я понял это благодаря этому репо . Короче говоря, PTVSD несовместим с функцией автоматической перезагрузки Flask. Его нужно отключить.

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

Я создал docker-compose.yml файл. Это не обязательно, но упрощенный процесс запуска сервера.

version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
      - "3000:3000"
    environment: 
      - FLASK_ENV=${FLASK_ENV}
    volumes:
      - .:/server_apps/webserver

Затем я создал docker-compose.debugger.yml.

version: '3'
services:
  web:
    # Replace default run function
    # --no-reload is necessary to run PTVSD debugger
    command: ["flask", "run", "--no-reload"]

, который заменяет команду запуска по умолчанию другой, имеющей --no-reload Аргумент.

Теперь, когда я разрабатываю свое приложение, я использую

$ docker-compose up

, который развертывает приложение автоматической перезагрузки конфигурации по умолчанию (docker-compose.yml) при каждом изменении кода. Когда что-то не так, и я хочу использовать отладчик, я набираю

$ docker-compose -f docker-compose.yml -f docker-compose.debugger.yml up
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...