我想知道如何在运行时获取有关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 楼
Dockerevents
命令可能会有所帮助,即使映像无法启动,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。
– 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
评论
请努力将答案之一标记为“已接受”,谢谢!