Конфликт портов отладки Docker/docker-compose и Pycharm

Я пытаюсь настроить среду отладки для Pycharm и Python (Fastapi) в Docker (с помощью docker-compose). Но уперся в проблему, что не могу запустить оба: отладочный сервер и докер-образ.

Моя настройка точки входа приложения:

# import debugpy
# debugpy.listen(('0.0.0.0', 5678))
# debugpy.wait_for_client()
# print("Debugger is attached!")

import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=5678, stdoutToServer=True, stderrToServer=True)

В Pycharm я настроил порт 5678 для Python Debug Server. Так, если я сначала начну отладку в Pycharm, то во время docker-compose up получу ошибку:

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:5678 -> 0.0.0.0:0: listen tcp 0.0.0.0:5678: bind: address already in use

Если я сначала запущу docker-compose, то при запуске отладки в Pycharm я получу ошибку:

Address already in use

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

Я пытался гуглить, но ничего.

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

Пожалуйста, порекомендуйте.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
252
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете изменить использование порта с помощью образов докера. Вы можете сделать это с помощью docker-compose. Вы можете обратиться к этому посту, чтобы понять, как это сделать Изменение порта в docker-compose.yml. Или при запуске изображений с помощью команды «run»

да, могу, но что это даст? насколько я понимаю, pycharm должен прослушивать тот же порт, что и pydevd_pycharm, и если я изменю порт в докере, он станет недоступен.

ypeskov 12.04.2024 18:33

Что ж, я уверен, что это уже должно быть очевидно, но вы не можете одновременно запускать две службы на одном и том же порту вашего компьютера, поэтому вам придется выполнить некоторую переадресацию. Я постараюсь вам это объяснить:

import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=5678, stdoutToServer=True, stderrToServer=True)

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

Затем вы обновите свой docker-compose, чтобы использовать другой свободный порт. 5679, например. Ваш docker-compose будет выглядеть так:

ports:
  - "5679:5678"

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

После этого вы сможете получить доступ к своему сервису через порт 5679.

Насколько я понимаю, основная причина в том, что и Docker, и Pycharm пытаются прослушивать один и тот же порт: 5678/5679 на хост-машине, а не в Docker.

ypeskov 15.04.2024 19:18

да, эта часть ясна. Но это либо не решает проблему, либо я что-то делаю не так. Что у меня есть: [docker: 5678] <-> (хост 5678) можно настроить 5679:5678/5555:5678 и любой другой. проблема в том, что в Pycharm есть конфигурация для отладки, где вы должны указать порт для прослушивания. и если я сначала запускаю конфигурацию отладки в Pycharm, то Pycharm блокирует этот порт на хост-компьютере, и Docker уже не может запуститься с ним. Если я запущу Docker первым, Pycharm не сможет запустить конфигурацию отладки и скажет: «Адрес уже используется».

ypeskov 15.04.2024 19:23
Ответ принят как подходящий
  • Замените «localhost» на «host.docker.internal» (по крайней мере, на Mac).
  • Удалите все перенаправления портов для порта 5678 (чтобы Docker не пытался его выделить)
  • Используйте это в коде:
import pydevd_pycharm

pydevd_pycharm.settrace('host.docker.internal', port=5678, stdoutToServer=True, stderrToServer=True)

Возможно, вам также захочется взглянуть на последний ответ здесь.

Бинго! Это решило проблему.

ypeskov 21.06.2024 13:51

Другие вопросы по теме