debugging在Docker中运行的python应用程序

最近我刚开始试图把我的头围在Docker上,并成功地开发了一台开发机器。 我现在要做的是能够在我的Python应用程序(特别是Django)中使用Visual Studio代码中的debugging器。

我已经试过跟在VS代码的python扩展的有限的文档,它解释了远程debugging的参数。

Dockerfile

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 [] 

泊坞窗,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 

launch.json

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

我还将ptvsd.enable_attach("debug_secret", address = ('0.0.0.0', 8000))到其中一个项目文件

问题

当我开始debugging器时,什么也没有发生,看起来像VS代码正在等待一个断点。 但它从来没有。

有任何想法吗?

编辑:次要更新

我已经尝试使用不同的端口的debugging器,以及暴露docker-compose.yml的新端口没有任何成功。 它看起来像attach是成功的,因为debugging器不会崩溃,但不会触发断点。 我真的被困在这一个。

看到巴克曼的回答。 我会补充说,我无法使用一个秘密来得到这个工作。 我做了以下几点:

manage.py

 import ptvsd ptvsd.enable_attach(secret=None, address=('0.0.0.0', '3000')) 

launch.json

 { "name": "Attach Vagrant", "type": "python", "request": "attach", "localRoot": "${workspaceRoot}", "remoteRoot": "/code", "port": 3000, "secret": "", "host":"localhost" } 

通过将ptvsd代码放入我的manage.py文件并closuresDjango的实时代码重新加载,我得到了最成功的远程debuggingdockerized Django项目。

由于Django在运行服务器(实际上是重新加载,另一个用于实际的应用程序服务器)时本质上是将两台服务器交换在一起,所以ptvsd似乎非常困惑,应该关注哪个服务器,我可以通过等待对于附件,尝试/除了enable_attach方法或打入debugging器 – 但断点永远不会工作,我似乎只能debugging一个单一的文件。

如果在启动服务器时使用django标志--noreload ,则可以将ptvsd放在manage.py文件中,而不必等待/打入debugging器废话,并享受更强大的debugging体验。

manage.py:

 import ptvsd ptvsd.enable_attach(secret='mah_secret', address=('0.0.0.0', 3000)) 

运行服务器:

 python manage.py runserver 0.0.0.0:8000 --noreload 

希望这可以帮助!

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

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() 

只要我在我的Python脚本中添加了这个,我的断点工作。 希望它有一些用处。


编辑2017年1月24日

在我的DockerFile中我安装了ptvsd

 FROM kaixhin/theano RUN pip install ptvsd WORKDIR /src EXPOSE 3000 ENTRYPOINT ["python","src/app.py"] COPY . /src 

它看起来像你的安装依赖通过你的requirements.txt文件,是你的requirements.txt中的ptvsd