【问题标题】:How to view logs for a docker image?如何查看 docker 镜像的日志?
【发布时间】:2016-10-16 09:35:40
【问题描述】:

在 docker 世界中,可以很容易地看到 docker 容器的日志(即运行映像)。但是在图像创建过程中,通常会发出多个命令。例如节点项目中的 npm install 命令。查看这些命令的日志也是有益的。我快速从文档中搜索,但没有找到如何获取 docker 映像的日志。有可能吗?

【问题讨论】:

  • 所有这些都在创建时通过管道传输到标准输出。你能不能把它重定向到一个日志(或者如果你想要两者都可以的话)-docker build -t something . > build.log 吗?

标签: docker dockerfile docker-image


【解决方案1】:

遇到了同样的问题,我解决了

docker build --no-cache --progress=plain -t my-image .

【讨论】:

  • 猜你应该在这里插入build。否则,这就是我正在寻找的答案。
  • 是的。 --progress=plain 是关键元素!
【解决方案2】:

最简单的方法是使用tee 将所有命令输出的副本发送到日志文件。如果您希望将其附加到图像上,请将运行命令输出到图像内的日志文件中,例如:

RUN my-install-cmd | tee /logs/my-install-cmd.log

然后你可以运行一个快速的一次性容器来查看日志的内容:

docker run --rm my-image cat /logs/my-install-cmd.log

如果您不需要附加到映像的日志,则可以完全按照 JHarris 所说的那样,对构建命令进行一次更改(而不是对运行命令进行大量更改)来记录每个构建的输出:

docker build -t my-image . | tee my-image.build.log

如果您在不使用--rm=true 的情况下进行构建,那么您拥有所有中间容器,并且每个中间容器都有一个您可以查看的日志

docker logs $container_id

最后,不要忘记图像中图层的历史。它们不显示每个命令的输出,但它对于所有那些不记录任何输出并且知道每个层来自哪个构建的命令很有用,尤其是在使用大量缓存时。

docker history my-image

【讨论】:

  • 这是否意味着“日志文件在您的图像之外”?
  • 我正在考虑将它们包含在图像中,以便将图像和创建它的日志保存在一起。例如RUN my-install-cmd | tee /logs/my-install-cmd.log 在 Dockerfile 中。然后你可以docker run --rm my-image cat /logs/my-install-cmd.log查看该镜像的安装日志。
  • 啊酷。只需检查 JHarris 的评论是否将整个构建输出保存在外部。您可能希望将该详细信息添加到 A。
【解决方案3】:

您可以使用此命令在 powershell 中查看日志

docker logs --details <containerId>

还有其他选项与日志here

【讨论】:

  • 抱歉,构建的临时容器的容器 ID 是什么?如果构建失败,哪一个是希望读取日志的最重要用例?
  • 关于图像而不是容器的问题
  • 我假设您了解容器和图像之间的区别,在这种情况下同上@SerdarD。此外,请考虑将您的答案编辑成对所问内容有用的内容。如果没有,请在您对基础知识更加熟悉之前不要提供 docker 问题的答案。
【解决方案4】:

使用这个:https://github.com/jcalles/docker-wtee
阅读说明,请给我反馈。
或者...
如果您需要从正在运行的容器中获取日志,并且容器已经暴露了卷,请运行以下命令:

docker run --rm -it --name testlogs --link <CONTAINERNAME/ID> --network CONTAINERNETWORK -p PORT:8080 --volumes-from CONTAINERNAME/ID  javiercalles/wtee sh

【讨论】: