在 VS Code 中调试 dockerized Django 导致错误“等待启动器连接超时”

Posted

技术标签:

【中文标题】在 VS Code 中调试 dockerized Django 导致错误“等待启动器连接超时”【英文标题】:Debugging dockerized Django in VS Code results in error "Timed out waiting for launcher to connect" 【发布时间】:2020-11-07 12:24:46 【问题描述】:

我想在 Visual Studio Code 中使用 docker 容器调试我的 Django 应用程序。

Microsoft 发布了如何做到这一点的指南,我一步一步地遵循了该指南: https://code.visualstudio.com/docs/containers/quickstart-python

但是当我尝试运行调试器时,我收到以下错误消息:

Timed out waiting for launcher to connect

这是我一步一步做的:

    我使用django-admin startproject helloworld 初始化了一个简单的 Django 应用程序 在 VS Code 中,我打开了包含 manage.py 的文件夹 打开命令面板Ctrl + Shift + P,然后选择Docker: Add Docker Files to Workspace... 选择应用平台Python: Django 包含 Docker Compose 文件No 应用入口点的相对路径manage.py 您的应用程序侦听哪些端口? 8000

VS Codes 然后创建几个文件(见下文)。


当我尝试启动调试器时(如指南中所示),我收到以下错误消息:

终端不显示任何错误消息,但执行的命令:


.vscode/launch.json:


    "configurations": [
        
            "name": "Docker: Python - Django",
            "type": "docker",
            "request": "launch",
            "preLaunchTask": "docker-run: debug",
            "python": 
                "pathMappings": [
                    
                        "localRoot": "$workspaceFolder",
                        "remoteRoot": "/app"
                    
                ],
                "projectType": "django"
            
        
    ]

.vscode/tasks.json:


    "version": "2.0.0",
    "tasks": [
        
            "type": "docker-build",
            "label": "docker-build",
            "platform": "python",
            "dockerBuild": 
                "tag": "dockerdebugging:latest",
                "dockerfile": "$workspaceFolder/Dockerfile",
                "context": "$workspaceFolder",
                "pull": true
            
        ,
        
            "type": "docker-run",
            "label": "docker-run: debug",
            "dependsOn": [
                "docker-build"
            ],
            "python": 
                "args": [
                    "runserver",
                    "0.0.0.0:8000",
                    "--nothreading",
                    "--noreload"
                ],
                "file": "manage.py"
            
        
    ]

Dockerfile:

# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3.8-slim-buster

EXPOSE 8000

# Keeps Python from generating .pyc files in the container
ENV PYTHONDONTWRITEBYTECODE 1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED 1

# Install pip requirements
ADD requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
ADD . /app

# Switching to a non-root user, please refer to https://aka.ms/vscode-docker-python-user-rights
RUN useradd appuser && chown -R appuser /app
USER appuser

# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "helloworld.wsgi"]

requirements.txt:

# To ensure app dependencies are ported from your virtual environment/host machine into your container, run 'pip freeze > requirements.txt' in the terminal to overwrite this file
django==3.0.3
gunicorn==20.0.4

VS 代码版本:1.47.1 Python 扩展版本:v2020.7.94776

【问题讨论】:

您使用的计算机系统是什么?重新加载后是否同样的问题? 我使用的是 Ubuntu 18.04,重新加载后没有运气。我刚刚检查过,VS Code 确实成功创建了一个 docker 容器,但无论如何都无法连接。 【参考方案1】:

这是一个线索和解决方法:

我遵循的说明让我在我的 ubuntu WLS2 实例中打开 VS 代码。注意:我的应用程序只是一个通用的 python 应用程序,而不是 django。

如果我单击它并将其更改为作为 windows 文件夹打开,然后进行有趣的调试,一切突然对我有用。 (它启动 docker 并通过调试、断点等连接到它)

我认为对我来说发生的事情是“有时” docker 在其自己的 WSL 实例上启动容器/应用程序,而我的 ubuntu 实例无法路由到它进行调试。

我说有时,因为有时它有效。我认为这可能与我在启动机器时首先启动的应用程序(docker、ubuntu、vscode)有关。 我弄乱了 docker、资源、WSL 集成设置、windows 防火墙,并重新启动了各种东西。

我确信正确的修复并不那么复杂,但是在本机窗口中运行 VS 代码对我来说就足够了。我不明白为什么实际上需要在 WSL 中启动 VS 代码会话所增加的复杂性。

【讨论】:

【参考方案2】:

在vs代码中调试的思路是:

使用 debugpy 通过端口(例如 5678)启动代码 在 vscode 中“远程附加”到该进程。

我可能错了,但我可以从您的代码中看到,您没有附加到您的流程中。

我按照here 的方式编写,我使用 docker-compose 和 docker。我的方式与你的不同,但你会明白的......:)

【讨论】:

【参考方案3】:

我的问题是缺少包。 Docker 通常工作正常,我之前完全没有任何问题。

我最初按照官方文档中的描述安装了 docker: https://docs.docker.com/engine/install/ubuntu/

但在我尝试安装 docker.io 包后,在 VS Code 中调试工作正常:

sudo apt install docker.io

【讨论】:

【参考方案4】:

与您项目中的 vscode 教程相比,没有错误。导致错误是等待午餐器连接超时,尝试重新启动docker服务并在vscode中重新加载您的窗口。

【讨论】:

我重新启动了docker,重新加载了vscode,没有成功。我还重新启动了我的机器(Ubuntu 18.04),也没有成功。顺便说一句,VSCode 正在创建一个工作容器。 这很奇怪,因为我已经尝试过这个教程,同样的错误,但是在我重新启动 docker 并且它正在运行后,错误消失了。 我找到了解决方案(见下文),但因为我不能给自己赏金,所以你可以拥有它;-) 所以问题是缺少包裹,明白了,感谢您的赏金~

以上是关于在 VS Code 中调试 dockerized Django 导致错误“等待启动器连接超时”的主要内容,如果未能解决你的问题,请参考以下文章

在 VS Code 中调试 dockerized Django 导致错误“等待启动器连接超时”

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

docker-compose 用于将 VS Code 中的 node.js 调试器附加到 WSL docker 中的节点进程

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

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

在 VS Code 中调试vue项目