我有一个容器问题,即使它构建完美,也无法正确启动。原因是我已添加到Dockerfile中的解决方法(因为具有可自行配置的/ etc / hosts路由)。

我想知道如何在运行时获取有关Docker在做什么的更多信息。例如,此方法有效:

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override


但这不起作用:日志,我也无法调用交互式外壳。我可以使用strace查看发生了什么,但我希望有更好的方法。

有什么方法可以将docker设置为更详细? Andrew D.我现在知道上面的代码有什么问题(我把它留了下来,所以他的回答可以理解)。现在的问题仍然是我该如何调试像这样的东西,或者深入了解为什么ls -l失败,为什么ls没有失败。我的情况...

评论

请努力将答案之一标记为“已接受”,谢谢!

#1 楼

Docker events命令可能会有所帮助,即使映像无法启动,Docker日志命令也可以获取日志。

首先在后台启动docker events以查看发生了什么。 br />
然后运行失败的docker run ...命令。
然后您应该在屏幕上看到类似以下内容的内容: 。然后,您可以将其与logs命令一起使用:

docker events&


现在您应该会看到失败的映像启动的一些输出。注释中建议:如果您的容器不断从诸如AWS ECS服务之类的设备中重新启动,则docker events&可能会很麻烦。在这种情况下,从/var/log/ecs/ecs-agent.log.<DATE>中的日志中获取容器的十六进制ID可能会更容易。然后使用docker logs <hex id>

评论


很有帮助! docker的新手,正试图使portainer运行。通过以下调试步骤解决了该问题。在Medium.com上发现了具有相同问题的某人:medium.com/@jameson_37151/…

–詹姆森
17-3-12在3:41



我得到“找不到容器”!?

–痴呆的刺猬
18年2月4日在23:17

奇怪。只是为了确保,@ dementedhedgehog是否尝试从以“(from xxx / xxx:latest)die”结尾的日志消息中复制十六进制ID?

– Peter Lamberg
18-2-5在10:26

非常感谢您的回答,这可以节省生命。唯一要添加的是,如果您的容器不断从诸如AWS ECS服务之类的东西重新启动,则docker events&可能会很麻烦。因此,在这种情况下,从/var/log/ecs/ecs-agent.log。中的日志中获取容器的十六进制ID可能会更容易。然后按照此答案的建议使用docker logs 来查看为什么无法启动。

– alexkb
18年7月13日在2:43



@alexkb谢谢!我将您的建议添加到答案的末尾,以便其他人可以更轻松地找到它。

– Peter Lamberg
18年7月14日在11:16

#2 楼

到目前为止,我发现的最好的方法是:

#stop the current demon and start it in debug modus
sudo service docker stop
dockerd -D # --debug


刚刚从新的shell启动客户端。误解是认为客户端实际上可以执行任何操作……好吧,它只是与守护程序通信,因此您不想调试客户端,而要调试守护程序本身(通常)。

#3 楼

就我而言,-a(附加到STDOUT / STDERR)标志就足够了:
supervisord)。我认为大多数容器启动错误也会出现在这里。

评论


很棒,谢谢。

–bigbadmouse
20 Mar 24 '20 at 10:19

#4 楼

我无法回答有关如何使docker输出更完整的问题,但我可以告诉您,就地正则表达式替换.so文件中的字符串有点疯狂:该字符串仅分配了太多空间,并且如果更改其他条目的文件偏移,则elf文件将损坏。在容器外运行perl命令(在LD_LIBRARY_PATH更改之前)后,请尝试在.so文件上运行objdump或readelf。 hack是因为“ tmp”和“ etc”具有相同的字符串长度,所以偏移量没有变化。如果您不想使用/ tmp,请考虑使用目录/ dkr或类似目录。在源中。或者更好的方法是,在构建修改后的libnss_files.so时,将其重命名为libnss_altfiles.so,并在启动Docker容器时将nsswitch.conf更改为使用hosts: altfiles(除非docker也绑定了nsswitch.conf挂载,否则您无法更改)。这将使libnss_altfiles.so与基本系统中的常规库并行。如果docker确实绑定了nsswitch.conf,请将重建的libnss_files.so的副本保留在/ lib-override目录中,以供LD_LIBRARY_PATH加载。忽略LD_LIBRARY_PATH和LD_PRELOAD,因此,如果使用这些变量,则有些东西会中断(阅读:返回使用默认的/ etc / hosts)。

评论


非常感谢您的深刻见解...我太快了,现在看看发生了什么。我仍然不知道为什么获取统计信息需要解析主机(ls -l)而简单文件列表(ls)却不...

–estani
2014年5月20日晚上8:39

#5 楼

有时,您可以通过以下方法找到有用的错误消息:进入运行docker守护程序的节点,然后执行以下操作:

$ tail -f /var/log/containers/* /var/log/docker.log 2>&1


在Mac OS上的“ Docker社区版”上,您可以通过执行以下操作连接到docker vm:

$  screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty