Python Docker远程调试VS代码

Par*_*ess 6 python docker docker-compose visual-studio-code

试图获取我的python flask API的远程调试信息。我能够docker-compose起来,让邮递员成功调用正在运行的容器,但是当我尝试连接调试器时,它永远不会编译。以下是我的yml,dockerfile和vscode启动设置...我得到的以下错误是:

启动调试服务器时出错。错误= {“代码”:“ ECONNREFUSED”,“ errno”:“ ECONNREFUSED”,“ syscall”:“连接”,“地址”:“ 127.0.0.1”,“端口”:5050}

version: '2'

services:
  website:
    build: .
    command: >
      python ./nomz/app.py
    environment:
      PYTHONUNBUFFERED: 'true'
    volumes:
      - '.:/nomz'
    ports:
      - '5000:5000'
      - '5050'
Run Code Online (Sandbox Code Playgroud)

Docker文件

FROM python:3.6-slim

ENV INSTALL_PATH /nomz
RUN mkdir -p $INSTALL_PATH

WORKDIR $INSTALL_PATH

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

EXPOSE 5000 5050
Run Code Online (Sandbox Code Playgroud)

VSCode启动设置

{
  "name": "Python: Attach",
  "type": "python",
  "request": "attach",
  "localRoot": "${workspaceFolder}/nomz/app.py",
  "remoteRoot": "/nomz/",
  "port": 5050,
  "host": "localhost"
}
Run Code Online (Sandbox Code Playgroud)

Par*_*ess 4

我终于通过远程调试让它工作了。我必须在本地 pip3 install ptvsd==3.0.0 ,并确保我的 docker 容器的requirements.txt 具有相同的版本。(注:最新版本3.2.1不起作用)

@BrettCannon 有一个很好的教程的正确链接 https://code.visualstudio.com/docs/python/debugging#_remote-debugging

我要做的就是向 Flask 应用程序的 app.py 添加一些代码。我最初在启动容器时收到地址已在使用错误,因此我添加了套接字代码,在调试器第一次成功连接后,我似乎不再需要它了(我知道很奇怪,但这就是为什么我将其留在如果其他人收到该错误)

try:
    import ptvsd
    # import socket
    # sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # sock.close()
    ptvsd.enable_attach(secret=None,address=('0.0.0.0',5050))
    ptvsd.wait_for_attach()
except Exception as ex:
    print('Not working: ')
Run Code Online (Sandbox Code Playgroud)

我还从 Flask 应用程序的 app.py 中的 app.run() 中删除了 debug kwarg。这一切使我能够连接调试器,但断点处于“未验证”位置,因此最后必须发生的事情是remoteRoot 的launch.json 中app.py 的路径。我会说我创建了一个小型测试 api 来让它工作,它只需要第一级路径(即 /app 而不是 /app/app/app.py)这里是我制作的测试 api 的 github (https://github.com/tomParty/docker_python)。因此,如果调试器正在附加,但您的断点未经验证,请尝试使用 RemoteRoot 的路径

"remoteRoot": "/nomz/nomz/app.py"
Run Code Online (Sandbox Code Playgroud)