如何在 Docker 容器中运行 pdb

tru*_*one 8 python pdb docker

我显然不明白这里的一些东西。我正在尝试pdb在 Docker 容器中以交互方式运行调试器。

这是一些代码:

Dockerfile:

FROM python:3.6
ENV PROJECT_DIR=/opt/foo
WORKDIR $PROJECT_DIR
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "foo.py"]
Run Code Online (Sandbox Code Playgroud)

foo.py:

def hello_world():
    print("hello world")
if __name__ == '__main__':
    #import pdb; pdb.set_trace()
    hello_world()
Run Code Online (Sandbox Code Playgroud)

如果我运行docker build -t foo .然后docker run foo,它会按预期打印出“hello world”。

但是如果我取消对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
Run Code Online (Sandbox Code Playgroud)

我没有得到什么?


编辑: 当调试蟒蛇BbdQuit提出不是一个重复的问题。

正如@soundstripe 正确识别的那样,我的问题不是在 Docker 中为 pdb 提供交互式访问。

sou*_*ipe 14

pdb需要一个带有 TTY 的可用终端。您可以通过告诉 Docker 将容器中的交互式 TTY 附加到您的终端来轻松运行 pdb -it

docker run -it foo

我通常还会添加--rm删除临时容器的选项。

docker run -it --rm foo

但这在调试期间并不总是最好的,因为完成后容器就消失了。


Jon*_*han 7

Soundstripe 的提示对我不起作用。但是,您可以打开一个新终端并输入

docker attach [container_name]
Run Code Online (Sandbox Code Playgroud)

现在您应该可以使用 pdb。

您可能需要将这些添加到 docker-compose yml 文件中的服务定义中以使其工作:

    stdin_open: true
    tty: true
Run Code Online (Sandbox Code Playgroud)

  • 我一直在到处寻找一种从 compose 启动的容器运行 pdb 的方法。这有效!在需要的地方添加 pdb 行。使用 -d 选项开始撰写。附加到所需的容器。 (2认同)
  • 要在命中断点后退出 TTY,请按“Ctrl”+“P”,然后按“Ctrl”+“Q”。**不要**使用`Ctrl`+`C`,它会杀死进程。 (2认同)