如何在Docker容器中运行pdb

时间:2019-05-02 16:31:42

标签: python docker pdb

我在这里显然不明白。我正在尝试在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()的呼叫并重试,则会收到以下错误消息:

/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

我没有得到什么?


修改BbdQuit raised when debugging python不是重复的问题。

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

3 个答案:

答案 0 :(得分:4)

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

docker attach [container_name]

现在您应该可以使用pdb。

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

    stdin_open: true
    tty: true

答案 1 :(得分:3)

pdb需要具有TTY的可用终端。您可以通过告诉Docker使用-it将容器中的交互式TTY附加到您的终端,从而轻松运行pdb:

docker run -it foo

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

docker run -it --rm foo

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

答案 2 :(得分:0)

添加到乔纳森的答案 - 要在遇到断点时退出 TTY,请按 Ctrl+P,然后按 Ctrl+< kbd>Q。 不要使用Ctrl+C,它会杀死进程。