如何调试docker容器初始化?

如何调试docker容器初始化?

我遇到了一个容器问题,尽管它构建得很完美,但却无法正常启动。原因是我在 Dockerfile 中添加了一个解决方法(用于自行配置 /etc/hosts 路由)

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

显然其中存在一些错误,但我想知道如何才能获得有关 docker 在运行时正在做什么的更多信息。例如,这是有效的:

$ docker run image ls
usr bin ...

但事实并非如此:

$ docker run image ls -l
$

日志中没有任何内容,我也无法调用交互式 shell。我可以使用 strace 查看发生了什么,但我希望有更好的方法。

有什么方法可以让我将 docker 变得更详细吗?

编辑:感谢 Andrew D。我现在知道上面的代码有什么问题了(我留下它是为了让他的回答能被理解)。现在的问题仍然是我该如何调试这样的事情,或者了解为什么ls -l失败了,为什么ls没有。

编辑:-D=true 可能会提供更多输出,但就我的情况而言并非如此……

答案1

Dockerevents命令可能会有所帮助Docker 日志即使图像启动失败,命令仍可以获取日志。

首先docker events在后台启动以查看发生了什么。

docker events&

然后运行失败的docker run ...命令。然后你应该在屏幕上看到类似以下内容:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

然后,您可以从上一条消息或运行命令的输出中获取启动十六进制 ID。然后,您可以将它与 logs 命令一起使用:

docker logs <copy the instance id from docker events messages on screen>

您现在应该可以看到一些失败的图像启动的输出。

正如 @alexkb 在评论中所说:docker events&如果您的容器不断从 AWS ECS 服务等重新启动,则可能会很麻烦。在这种情况下,从日志中获取容器十六进制 ID 可能更容易/var/log/ecs/ecs-agent.log.<DATE>。然后使用 docker logs <hex id>

答案2

目前我发现的最好的答案是:

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

然后从新 shell 启动客户端。误解是认为客户端实际上什么都没做……好吧,它只是与守护进程通信,所以你不想调试客户端,而是守护进程本身(通常)。

答案3

就我而言,-a(附加到 STDOUT/STDERR)标志就足够了:

user@machine:~$ docker start -a server_name
Error: The directory named as part of the path /log/log_path/app.log does not exist.
For help, use /usr/bin/supervisord -h

它显示了启动错误(在我们的例子中,缺少使用的日志路径supervisord)。我认为大多数容器启动错误也会显示在这里。

答案4

有时,您可以通过 ssh 进入运行 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

相关内容