如何使用 VS Code 在 Docker 容器中远程调试 python 代码

Posted

技术标签:

【中文标题】如何使用 VS Code 在 Docker 容器中远程调试 python 代码【英文标题】:How to remote debug python code in a Docker Container with VS Code 【发布时间】:2017-03-07 03:30:41 【问题描述】:

我刚刚注册了这个问题。这是关于是否可以使用 VS Code 在 Docker 容器中远程调试 python 代码。 我在这里有一个完全配置的 Docker 容器。我得到了一些帮助,而且我对 docker 还是很陌生。在其中运行 Odoo v10。但是我无法在 VS Code 中进行远程调试。我试过this 的解释,但我真的不明白。 甚至可能吗?如果是,我怎样才能让它工作? 我正在使用 VS Code 1.6.1 和 Don Jayamanne 的 Python 扩展运行 Kubuntu 16.04。 啊,是的,我希望我在这个问题上处于正确的位置,并且不违反任何规则。

更新:

刚刚尝试了 Elton Stoneman 的方法。有了它,我收到了这个错误:

There was an error in starting the debug server. 
Error = "code":"ECONNREFUSED","errno":"ECONNREFUSED","syscall":"connect",
         "address":"172.21.0.4","port":3000

我的Dockerfile 看起来像这样:

FROM **cut_out**
USER root
# debug/dev settings

RUN pip install \
        watchdog

COPY workspace/pysrc /pysrc
RUN apt-get update \
 && apt-get install -y --no-install-recommends \
        build-essential \
        python-dev \
 && /usr/bin/python /pysrc/setup_cython.py build_ext --inplace \
 && rm -rf /var/lib/apt/lists/*

EXPOSE 3000

USER odoo

我的 Dockerfile 中的 pysrc 在那里,因为它之前是为与 PyDev (Eclipse) 一起工作而设计的。

这是我用过的run command

docker-compose run -d -p 3000:3000 odoo

这是我launch.json的重要部分:

    
        "name": "Attach (Remote Debug)",
        "type": "python",
        "request": "attach",
        "localRoot": "$workspaceRoot",
        "remoteRoot": "$workspaceRoot",
        "port": 3000,
        "secret": "my_secret",
        "host": "172.21.0.4"
    

我希望现在这些信息已经足够了。

更新 2:

好的,我找到了解决方案。我完全误解了 Docker 的工作原理,并且完全错误地尝试了它。我已经有一个完整配置的 Docker-compose。所以我需要做的就是让我的 VS Code 配置适应 docker-compose.yml。这意味着我只需将launch.json更改为端口8069(默认Odoo端口)并且只需要使用docker-compose up,然后在VS Code中进行调试即可。 不幸的是,ptvsd 的使用有点破坏了我的 Odoo 环境,但至少我现在可以调试了。谢谢!

【问题讨论】:

您能否使用您在launch.json 中输入的内容更新您的更新 2?当您说您使用docker-compose up 时,也不确定您的意思。对您的工作流程的解释将不胜感激:) 不幸的是,我的launch.json 不再用于这个项目,但我所做的只是将端口更改为"port": 8069docker-compose 是一个扩展 docker 功能的工具。 docker-compose up 只是启动所有找到的 docker 容器。我不得不说它仍然没有按预期工作,我从来没有在 VS Code 中远程调试 docker 来工作。如果你让它工作,请告诉我:)。 嗨 - 后续问题 - 为什么将端口更改为 8069 可以解决您的问题?你有原始的 docker-compose 文件吗? 【参考方案1】:

是的,这是可能的——当 Python 应用程序在 Docker 容器中运行时,您可以将其视为远程机器。

在您的 Docker 映像中,您需要使远程调试端口可用(例如 Dockerfile 中的 EXPOSE 3000),在您的 Python 应用程序中包含 ptvsd 设置,然后在运行容器时发布该端口,类似:

docker run -d -p 3000:3000 my-image

然后使用docker inspect获取正在运行的容器的IP地址,这就是你在启动文件中使用的host

【讨论】:

非常感谢,这对我帮助很大!但还有一件事:我是否必须在我拥有的每个.py 脚本中导入ptvsd?因为这对于 Odoo 来说会很多。有没有更好的方法,例如每个项目一个导入? 刚刚有时间按照自己的方式尝试,不幸的是它不起作用。每次我尝试调试时,我都会在调试控制台中收到此错误: 抱歉,刚习惯 ***。此错误:There was an error in starting the debug server. Error = "code":"ECONNREFUSED","errno":"ECONNREFUSED","syscall":"connect","address":"172.21.0.4","port":3000 There was an error in starting the debug server. Error = "code":"ECONNREFUSED","errno":"ECONNREFUSED","syscall":"connect","address":"172.21.0.4","port":3000(我两次得到相同的输出)可能有什么想法吗? 你能用你的 Dockerfile 和docker run 命令更新你的问题吗? EXPOSE 实际上并没有暴露端口(但-p 会),因此如果您不想将其保留用于文档目的,您可以随时将其省略; docs.docker.com/engine/reference/builder/#expose【参考方案2】:

适用于 vscode 1.45.0 及更高版本。供参考文件https://gist.github.com/kerbrose/e646aaf9daece42b46091e2ca0eb55d0

1- 编辑您的docker.dev 文件并插入RUN pip3 install -U debugpy。这将安装一个 Python 包 debugpy 而不是已弃用的 ptvsd,因为您的 vscode(本地)将使用它与您的 docker 映像的 debugpy(远程)服务器通信。

2- 启动您的容器。但是,您将启动刚刚安装的 python 包debugpy。它可以作为你 shell 的下一个命令。

docker-compose run --rm -p 8888:3001 -p 8879:8069 DOCKER IMAGE[:TAG|@DIGEST] /usr/bin/python3 -m debugpy --listen 0.0.0.0:3001 /usr/bin/odoo --db_user=odoo --db_host=db --db_password=odoo

3- 准备您的启动器文件如下。请注意port 将与odoo 服务器相关。 debugServer 将是调试服务器的端口


    "name": "Odoo: Attach",
    "type": "python",
    "request": "attach",
    "port": 8879,
    "debugServer": 8888,
    "host": "localhost",
    "pathMappings": [
        
            "localRoot": "$workspaceFolder",
            "remoteRoot": "/mnt/extra-addons",
        
    ],
    "logToFile": true

【讨论】:

是的,这仍然有效。你有什么问题吗?? 我正在使用它来启动我的 docker(基于 zope 的应用程序)sudo docker run -it -p 8080:8080 -v ... /usr/bin/python3 -m debugpy 我在 Ubuntu 下得到了/usr/bin/python3: No module named debugpy 好吧,你只需要在你的容器中安装 debugpy 模块。你可以通过多种方式做到这一点。如果您运行公共图像。您使用docker exec -it -u 0 /bin/bash 然后pip3 install debugpy 登录到此类图像。但是,如果你有一个 docker 文件,你可以添加 RUN pip3 install -U debugpy 然后重建图像。 dev.to/kerbrose/…【参考方案3】:

如果您想逐步了解如何在容器中为 VS 代码附加远程调试器,您可以查看 YouTube 视频 "Debugging Python in Docker using VSCode"。

他还谈到了如何配置 Docker 文件,使容器在生产模式下运行时不包含调试器。

【讨论】:

以上是关于如何使用 VS Code 在 Docker 容器中远程调试 python 代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 VS Code 调试在 Docker 容器中使用 ts-node 运行的 TypeScript 应用程序时,如何能够正确设置断点?

VS Code 没有为在 Docker 容器中运行的 Node 应用程序打断点

vs code使用docker调试程序

从 docker 容器中打开 VS Code

在 Docker 容器内开发时启用 VS Code IntelliSense

在 Ubuntu 上的 VS Code 中运行 NGC 容器