[英]Debug python application running in Docker
我最近才開始嘗試圍繞 Docker 進行思考,並設法啟動並運行了一台開發機器。 我現在想要做的是能夠在我的 python 應用程序(特別是 Django)中使用 Visual Studio Code 中的調試器。
我嘗試遵循VS Code的python 擴展的有限文檔,其中解釋了遠程調試的參數。
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 []
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腳本中添加了這個,我的斷點就起作用了。 希望它有一些用處。
在我的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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.