Подтвердить что ты не робот

Удаленная отладка PyCharm в контейнере докеров

Я с трудом пытаюсь понять, как настроить удаленную отладку приложения Python (Flask), работающего в контейнере Docker. В частности, я использую docker-compose, PyCharm professional и python 3.5. Это то, что я сделал до сих пор:

  • Я скопировал "pycharm-debug-py3k.egg" в папку проекта
  • Я добавил следующие строки в файл wsgi.py:

    import sys
    sys.path.append('../pycharm-debug-py3k.egg') 
    import pydevd 
    pydevd.settrace('0.0.0.0', port=8200, stdoutToServer=True, stderrToServer=True)
    
  • Я создал конфигурацию удаленной отладки в PyCharm (путем сопоставления пути моего проекта на локальной машине к пути в контейнере Docker)

запустив отладочную конфигурацию (нажмите на значок ошибки) из PyCharm, она печатает (и зависает):

Starting debug server at port 4200
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('0.0.0.0', port=4200, stdoutToServer=True, stderrToServer=True)
Waiting for process connection...

... и в журналах докера-контейнера я читаю:

Не удалось подключиться к 0.0.0.0: 4200

Что я должен делать? (Моя цель - иметь возможность добавлять точки останова в PyCharm и останавливать выполнение приложения контейнера докера для его отладки)

4b9b3361

Ответ 1

Использовать удаленный интерпретатор, это позволит решить сразу несколько проблем. Я уже ответил на это здесь Богатые редакторы в среде разработки Docker

Добавьте удаленный SDK python в вашу среду IDE, затем он также устранит все библиотеки, которые будут установлены удаленно. Для этого вам понадобится SSH-соединение, поэтому установите sshd и используйте общий ключ разработчика, который я изложил в своем ответе.

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

Если вы все еще хотите использовать отладку на основе портов, см. Docker: MacOSX Expose Контейнерные порты для хост-машины - это объясняет, как вы должны понимать прикрепление и слушать часть.

Ответ 2

Используйте host.docker.internal вместо 0.0.0.0. Это позволит докеру решать, какой IP использовать.