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

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

使用docker start无法提供其他命令,如果容器再次突然死亡,则您将没有足够的时间进入容器并进行调查。

我们可以用不同的命令在新图像上执行docker commit,然后执行docker run,但是我想知道是否还有其他选择。

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

评论

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

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

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

#1 楼

跟踪为什么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中的strace选项进行写入。但是通常,strace会将输出保留在stdout上,这可以使用docker log读取。

相关的问:Linux进程神秘地终止

评论


这意味着我仍然必须先docker提交我停止的容器,才能从中启动映像

– SztupY
17 Mar 7 '17 at 15:20



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

– Evgeny Zislis
17 Mar 7 '17 at 15:23



这只是获得停止容器的方案之一

– SztupY
17 Mar 7 '17 at 15:25

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

– Evgeny Zislis
17 Mar 8 '17 at 10:43

#2 楼

据我所知,commitrun是最好的选择,可以让您完全访问容器死亡时的状态。

理想情况下,当容器出现时,您会吐出一些更有用的信息它失败了,但这是另一个主题。

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