我遇到了一个容器问题,尽管它构建得很完美,但却无法正常启动。原因是我在 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