如何在 Docker 容器中 运行 pdb
How to run pdb inside a Docker Container
我显然不明白这里的东西。我正在尝试 运行 pdb
调试器以交互方式 w/in 一个 Docker 容器。
这是一些代码:
Docker文件:
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 正确识别的那样,我的问题是没有为 pdb 提供交互式访问 w/in Docker。
pdb
需要一个带有 TTY 的可用终端。您可以 运行 pdb 通过告诉 Docker 将容器中的交互式 TTY 附加到您的终端 -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
添加到 Jonathan 的回答中 - 要在遇到断点时退出 TTY,请按 Ctrl+P 然后 Ctrl+Q。 不要使用Ctrl+C,它会终止进程。
我显然不明白这里的东西。我正在尝试 运行 pdb
调试器以交互方式 w/in 一个 Docker 容器。
这是一些代码:
Docker文件:
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 正确识别的那样,我的问题是没有为 pdb 提供交互式访问 w/in Docker。
pdb
需要一个带有 TTY 的可用终端。您可以 运行 pdb 通过告诉 Docker 将容器中的交互式 TTY 附加到您的终端 -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
添加到 Jonathan 的回答中 - 要在遇到断点时退出 TTY,请按 Ctrl+P 然后 Ctrl+Q。 不要使用Ctrl+C,它会终止进程。