调试在Docker中运行的python应用程序

Mat*_*ias 5 python django docker docker-compose visual-studio-code

最近,我刚刚开始尝试围绕Docker进行研究,并设法启动并运行了开发机器。我现在想做的是能够在我的python应用程序(特别是Django)的Visual Studio Code中使用调试器。

我尝试遵循VS Codepython扩展的有限文档,该文档解释了远程调试的参数。

Docker文件

FROM python:3.5.2
RUN apt-get update \
--no-install-recommends && rm -rf /var/lib/apt/lists/* \
&& mkdir -p /code \
EXPOSE 8000
WORKDIR /code
COPY requirements.txt /code
RUN /bin/bash --login -c "pip install -r requirements.txt"
ADD . /code
CMD []
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '2'
services:
    db:
        image: postgres
    web:
        build: .
        volumes:
            - .:/code
        ports:
            - "8000:8000"
        command: bash -c "./wait-for-it.sh db:5432 && python manage.py migrate && python manage.py runserver 0.0.0.0:8000 --noreload"
        depends_on:
            - db
Run Code Online (Sandbox Code Playgroud)

launch.json

{
    "name": "Attach (Remote Debug)",
    "type": "python",
    "request": "attach",
    "localRoot": "${workspaceRoot}",
    "remoteRoot": "/code",
    "port": 8000,
    "secret": "debug_secret",
    "host": "localhost"
}
Run Code Online (Sandbox Code Playgroud)

我还将该行添加ptvsd.enable_attach("debug_secret", address = ('0.0.0.0', 8000))到了项目文件之一

问题

每当我启动调试器时,都不会发生任何事情,并且看起来VS Code正在等待命中断点。但是它永远不会。

有任何想法吗?

编辑:小更新

我尝试为调试器使用不同的端口以及公开新端口都docker-compose.yml没有成功。看起来附加已成功,因为调试器不会崩溃,但不会触发断点。我真的很坚持这一点。

请参阅theBarkman的答案。我要补充一点,就是我无法使用秘密来使它正常工作。我做了以下工作:

manage.py

import ptvsd
ptvsd.enable_attach(secret=None, address=('0.0.0.0', '3000'))
Run Code Online (Sandbox Code Playgroud)

launch.json

{
        "name": "Attach Vagrant",
        "type": "python",
        "request": "attach",
        "localRoot": "${workspaceRoot}",
        "remoteRoot": "/code",
        "port": 3000,
        "secret": "",
        "host":"localhost"
    }
Run Code Online (Sandbox Code Playgroud)

小智 3

我试图做一些与你非常相似的事情,并遇到了这个问题/评论:

https://github.com/DonJayamanne/pythonVSCode/issues/252#issuecomment-245566383

其中描述了为了使用断点,您需要使用该ptvsd.break_into_debugger()函数。

举个例子:

import ptvsd
ptvsd.enable_attach(secret='my_secret',address = ('0.0.0.0', 3000))
ptvsd.wait_for_attach()
ptvsd.break_into_debugger()
Run Code Online (Sandbox Code Playgroud)

一旦我将其添加到我的 python 脚本中,我的断点就起作用了。希望它有一些用处。


2017 年 1 月 24 日编辑

在我的 DockerFile 中我安装了ptvsd

FROM kaixhin/theano
RUN pip install ptvsd
WORKDIR /src
EXPOSE 3000
ENTRYPOINT ["python","src/app.py"]
COPY . /src
Run Code Online (Sandbox Code Playgroud)

看起来您是通过requirements.txt文件安装依赖项的,ptvsd在您的requirements.txt 中吗?