PyCharm在Docker容器中的远程调试

35

我很难弄清如何设置远程调试在运行在 Docker 容器中的 Python 应用程序(Flask)。

具体来说,我正在使用 docker-compose、PyCharm 专业版和 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中的调试配置(单击bug图标),会打印出以下信息(并挂起):

    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...
    

    在 Docker 容器日志中我读到:

    无法连接到 0.0.0.0: 4200

    我应该怎么办?(我的目标是能够在 PyCharm 中添加断点,停止执行 Docker 容器应用程序以进行调试)


    我们需要更多信息。如果您设置了Python作为远程SDK,那么我建议在容器上安装一个SSHD服务器。在这种情况下,PyCharm应该可以为您完成所有操作,关于隧道的问题将不再是Docker的问题。 - Eugen Mayer
    不,我没有使用远程解释器... 我应该使用吗? - daveoncode
    2
    检查一下你的端口号,看起来在你的wsgi.py文件中你定义了pydevd.settrace('0.0.0.0', port=8200, stdoutToServer=True, stderrToServer=True),但是调试服务器运行在4200上,也许改成pydevd.settrace('0.0.0.0', port=4200, ...会起作用? - Pitt
    3个回答

    13

    使用host.docker.internal代替0.0.0.0。这样可以让Docker决定使用哪个IP。


    这应该是被接受的答案。是的,@Pitt 也是正确的 - 端口应该相同,无论是在运行的Python远程调试服务器中还是在注入的带有pydevd跟踪的代码中。 - juggernaut

    11

    使用远程解释器,这将一次性解决几个问题。我已经在这里回答过了:Docker开发环境中的富文本编辑器

    向你的IDE添加一个远程Python SDK,这也将解决所有被远程安装的库。但是,你需要一个SSH连接来完成这项任务,所以安装sshd并使用我在答案中概述的共享开发者密钥。

    即使现在需要付出更多努力,但这将为你带来更好的结果,包括在做仅通过远程端口连接时会遇到但尚未遇到和发现的其他部分。

    如果你仍想使用基于端口的调试,请参阅Docker:MacOSX将容器端口暴露给主机 - 这将解释如何理解附加和侦听部分。


    那么你是在主张在每个需要调试的容器中注入sshd并设置ssh访问吗? - lucid_dreamer
    因为这是通常且目前唯一的方法,所以是的。使用一个共享密钥的Sshd,仅用于DEV镜像。你将用Sshd的额外工作来换取一次性解决一堆问题的好处。 - Eugen Mayer
    在过去的三个小时里,我已经阅读了很多,我倾向于同意。那么,如何将远程主机的端口反向隧道连接到本地客户端,并从容器中执行代码(settrace)调用该端口,使用远程主机桥接IP(在local_client上设置IDE上的远程调试器运行)(这很令人困惑,我知道,这就是为什么我倾向于同意你的观点...)。 - lucid_dreamer
    我同意你所写的(也在链接的答案中),但这并没有真正展示如何做到。我必须在使用Python/Django编写的API中找到一个错误,并尝试使用远程调试器设置PyCharm Professional,但我总是得到“套接字关闭”、“连接到Python调试器失败”的提示,不知道该如何解决。您能否在您的答案中加入一些细节(最好是逐步说明),以便能够正确地设置它? - Matt

    0
    也许你应该连接到自己的主机,即你的PyCharm,而不是0.0.0.0,而是你自己的IP地址。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接