docker exec -ti <id> bash
仅在运行中的容器上起作用,一旦完成,bash提示也会终止。使用
docker start
无法提供其他命令,如果容器再次突然死亡,则您将没有足够的时间进入容器并进行调查。我们可以用不同的命令在新图像上执行
docker commit
,然后执行docker run
,但是我想知道是否还有其他选择。注意:
docker logs
只会返回打印到stdout / stderr的所有应用程序。这可能不足以找出问题所在。#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 楼
据我所知,commit
和run
是最好的选择,可以让您完全访问容器死亡时的状态。理想情况下,当容器出现时,您会吐出一些更有用的信息它失败了,但这是另一个主题。
编辑:要扩展我的答案,如果容器在开始时就快要死了,还可以使用
docker run
来指定备用--entrypoint
和CMD
。通常,我会将其设置为循环或不会自行退出的内容。进入容器后,您可以手动运行失败的步骤,然后检查结果,而不必担心容器会退出。
评论
经过一会儿思考:Docker主进程作为一个容器,它只打算运行一个进程,要么删除“ main”一词,要么您做的事情很奇怪(例如运行一个init进程),或者您将线程作为进程...我认为它是选项一,但我不得不说,因为这困扰着我@Tensibai有时,如果您的主命令本身无法处理pid 1 /信号问题,则有时必须运行dumb-init之类的操作。可能还有其他情况,一个docker容器运行多个进程
是的,这就是我所说的怪异现象,主要是因为已经制造了容器来隔离进程。有时容器不是应用程序的解决方案,愿意将所有内容放入容器中比其他任何方法更容易让人头痛。