[英]How to run pdb inside a Docker Container
我顯然不明白這里的一些東西。 我正在嘗試在 Docker 容器中以交互方式運行pdb
調試器。
這是一些代碼:
Dockerfile:
FROM python:3.6
ENV PROJECT_DIR=/opt/foo
WORKDIR $PROJECT_DIR
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "foo.py"]
foo.py:
def hello_world():
print("hello world")
if __name__ == '__main__':
#import pdb; pdb.set_trace()
hello_world()
如果我運行docker build -t foo .
然后docker run foo
,它按預期打印出“hello world”。
但是,如果我取消注釋掉上面對pdb.set_trace()
的調用pdb.set_trace()
試,我會收到以下錯誤:
/opt/foo/foo.py(8)<module>()
-> hello_world()
(Pdb)
Traceback (most recent call last):
File "foo.py", line 8, in <module>
hello_world()
File "foo.py", line 8, in <module>
hello_world()
File "/usr/local/lib/python3.6/bdb.py", line 51, in trace_dispatch
return self.dispatch_line(frame)
File "/usr/local/lib/python3.6/bdb.py", line 70, in dispatch_line
if self.quitting: raise BdbQuit
bdb.BdbQuit
我沒有得到什么?
編輯: 調試 python 時引發的 BbdQuit不是重復問題。
正如@soundstripe 正確識別的那樣,我的問題不是在 Docker 中為 pdb 提供交互式訪問。
pdb
需要一個帶有 TTY 的可用終端。 你可以告訴碼頭工人在容器中附上一個互動TTY到終端與輕松運行PDB -it
:
docker run -it foo
我通常還會添加--rm
選項來刪除我的臨時容器。
docker run -it --rm foo
但這在調試期間並不總是最好的,因為完成后容器就消失了。
Soundstripe 的提示對我不起作用。 但是,您可以打開一個新終端並輸入
docker attach [container_name]
現在您應該可以使用 pdb。
您可能需要將這些添加到 docker-compose yml 文件中的服務定義中以使其工作:
stdin_open: true
tty: true
添加到喬納森的答案 - 要在遇到斷點時退出 TTY,請按Ctrl + P然后按 Ctrl + Q 。 不要使用Ctrl + C ,它會終止進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.