簡體   English   中英

如何在 Docker 容器中運行 pdb

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

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