如何调查在Docker容器中死亡的主要流程?


13

有时,您必须检查一个已停止的容器,或者启动后很快死亡并停止的容器。

docker exec -ti <id> bash 仅适用于正在运行的容器,一旦完成,bash提示也会终止。

随着docker start你不能提供一个不同的命令,如果容器模具突然再次,你不会有足够的时间进入容器,做你的调查。

我们可以这样做docker commit,然后docker run使用不同的命令在新映像上进行操作,但是我想知道是否还有其他选择。

注意docker logs仅返回打印到stdout / stderr的所有应用程序。这可能不足以找出问题所在。


经过一会儿思考:Docker 进程 作为一个容器,它只运行一个进程,要么删除“ main”一词,要么您做的事情很奇怪(例如,运行一个init进程),或者您将线程作为进程...我认为它是选项一,但我不得不说,因为它困扰我
Tensibai

@Tensibai有时,如果您的主命令本身无法处理pid 1 /信号问题,则有时必须运行dumb-init之类的操作。可能还有其他情况,一个
docker

是的,这就是我所说的怪异现象,主要是因为已经制造了容器来隔离进程。有时容器不是应用程序的解决方案,愿意将所有内容放入容器中比其他任何方式更容易让人头痛。
Tensibai

Answers:


9

跟踪为什么Linux中的进程失败的一般方法是好的。一种这样的方法是运行一个进程strace,该进程将告诉您进程执行的系统调用,通常会指出失败的原因。

您可以创建一个Dockerfile看起来像这样的:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

然后使用运行新图像docker run debug_version strace original_cmd

对于派生子进程(然后死亡)的进程,您想strace使用该-ff选项运行。您还可以使用Docker数据卷映射某些文件,并使用-o选项from对其strace进行写入。但通常strace会将输出保留在stdout上,可使用读取docker log

相关问题:Linux进程神秘终止


这意味着我仍然必须docker commit先从停止的容器中获取图像,然后才能开始
SztupY

您说开始就死了。我假设你有一张照片。对于那些已停止的程序,是必需的提交。
Evgeny

那只是使集装箱停下来的场景之一
SztupY

strace在Alpine Linux中还有一个软件包pkgs.alpinelinux.org/package/edge/main/x86_64/strace。使用Alpine软件包管理器进行安装apk install strace
Evgeny

3

据我所知,commitrun在这里的最佳选择,让您完全进入容器,因为它是当它死了。

理想情况下,您的容器在发生故障时会吐出一些更有用的信息,但这是另一个主题。

编辑:扩大我的答案,如果容器在开始时就快要死了,您还可以使用docker run指定替代项--entrypointCMD。通常,我会将其设置为循环或不会自行退出的内容。进入容器后,您可以手动运行失败的步骤,然后检查结果,而不必担心容器会退出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.