簡體   English   中英

調試在 Docker 中運行的 python 應用程序

[英]Debug python application running in Docker

我最近才開始嘗試圍繞 Docker 進行思考,並設法啟動並運行了一台開發機器。 我現在想要做的是能夠在我的 python 應用程序(特別是 Django)中使用 Visual Studio Code 中的調試器。

我嘗試遵循VS Codepython 擴展的有限文檔,其中解釋了遠程調試的參數。

文件

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

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

啟動文件

{
    "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))到項目文件之一

問題

當我啟動調試器時沒有任何反應,看起來 VS Code 正在等待斷點命中。 但它永遠不會。

有任何想法嗎?

編輯:小更新

我曾嘗試為調試器使用不同的端口以及在docker-compose.yml公開新端口但沒有成功。 看起來附加成功,因為調試器沒有崩潰但沒有觸發斷點。 我真的被這個問題困住了。

解決方案

請參閱巴克曼的回答。 我要補充一點,我無法使用秘密來使其正常工作。 我做了以下事情:

管理文件

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

啟動文件

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

通過將ptvsd代碼放入我的manage.py文件並關閉Django的實時代碼重新加載,我獲得了最成功的遠程調試dockerized Django項目。

當你因為Django的基本上是旋轉起來2個服務器runserver (一個用於現場代碼重新加載,而另一個用於實際應用server`,ptvsd似乎得到真糊塗,應該看哪個服務器,我可以排序得到它等待工作對於附件,嘗試/除了enable_attach方法或進入調試器 - 但斷點永遠不會工作,我似乎只能一次調試一個文件。

如果在啟動服務器時使用django標志--noreload ,則可以將ptvsd放在manage.py文件中,而不必等待/破壞調試器的廢話,並享受更強大的調試體驗。

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嗎?

幾個麻煩的拍攝技巧:

1)確保您的調試端口已打開。 從你的主機運行。

nc -zv test.example.com 30302

2)確保您的webserve不會自動重新加載您的應用程序。 這將打破調試器連接。 在您的代碼中放置一個打印或日志語句,該代碼在啟動時運行,以確保您的應用程序未加載兩次。 這是用於在燒瓶上運行的socketio。 但是django和其他網絡服務器有類似的東西。

socketio.run(app,host =“0.0.0.0”,port = 5000,debug = True,use_reloader = False)

添加后,您可以使用命令docker-compose run --rm --service-ports {YOUR_CONTAINER}

def your_f():
    **import pdb
    pdb.set_trace()**
    result = your_logic
    return result

例子: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM