如何从正在运行的Docker容器中读取文件和标准输出


78

我将如何在主机中启动应用程序以便从正在运行的Docker容器中读取文件和stdout?

本质上我想这样做:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

我将如何去做?更具体地说明我要在哪里进行此操作;我想读取Docker容器的日志和标准输出,并在其他地方处理这些日志。

我也愿意创建另一个可以从另一个容器读取文件和stdout的docker容器,但是我不知道这样做是否可行。

Answers:


117

通过命令可以使用由docker容器启动的进程的标准输出(用于使其永远运行)。另一个选择是直接通过docker远程API流式传输日志。docker logs $containerid-f

要访问日志文件(仅在必要时才考虑登录到stdout或其他标准解决方案,例如syslogd),唯一的实时选项是配置卷(如Marcus Hughes建议的那样),以便将日志存储在容器外部并可供处理来自主机或另一个容器。

如果您不需要实时访问日志,可以使用以下命令导出文件(以tar格式)docker export


1
好发现。好像拖尾容器日志是在1.1.0版中引入的
rexposadas 2014年

@rexposadas该-f选项已经存在很长时间了(无论如何,在docker的时间范围内)。根据这个问题,至少7个月:github.com/dotcloud/docker/issues/2997
阿贝尔Muiño

我们已经设置了一个Cloudwatch,可以很好地存储一些日志,但是不存储标准输出日志。您的解决方案已经奏效,我们可以通过运行docker logs命令来查看这些日志,但是如何继续将其推送到Cloudwatch?
Ondrej Tokar

1
@OndrejTokar我对Cloudwatch并不熟悉,但是您可以将docker logs命令通过管道传递到监视该文件的文件,或者直接在容器中执行并将日志文件显示为卷。
阿贝尔·梅尼奥

1
@OndrejTokar,我猜您指的是awslogs驱动器(docs.docker.com/engine/admin/logging/awslogs)。如果其他人有兴趣,请在这里发布。
wanghq '16

16

要查看标准输出,您可以使用启动容器-i。当然,这不能使您离开开始的过程并浏览容器。

docker start -i containerid

或者,您可以在以下位置查看容器的文件系统

/var/lib/docker/containers/containerid/root/

但是,这些都不是理想的。如果要查看日志或任何持久性存储,正确的方法是在使用时在交换机上附加卷。这意味着您可以在主机上检查日志文件,也可以将它们附加到另一个容器中并在其中检查它们。-vdocker run


6

有点晚了,但这就是我正在做的 journald。它非常强大。

您需要使用来在操作系统上运行docker容器systemd-journald

docker run -d --log-driver=journald myapp

这会将全部内容传送到主机的日志中,日志中会处理诸如日志修剪,存储格式等内容,并为您提供一些不错的选项来查看它们:

journalctl CONTAINER_NAME=myapp -f

它将在登录时将其反馈到您的控制台,

journalctl CONTAINER_NAME=myapp > output.log

这样一来,您就可以将整个文件全部拿走,或者

journalctl CONTAINER_NAME=myapp --since=17:45

另外,docker logs ....如果这是您的偏好,您仍然可以通过查看日志。

没有更多的> my.log-v "/apps/myapp/logs:/logs"


1
这是所有人的更好答案!
巴斯特·安维尔19/12/22

4

泊坞窗容器和主机系统之间共享文件,或者单独的容器之间最好使用完成

使您的应用程序在另一个容器中运行可能是最好的解决方案,因为它将确保整个应用程序可以很好地隔离和轻松部署。您尝试做的事情听起来很接近这篇出色的博客文章中描述的设置,请看一下!


谢谢你的建议。使用卷可能不是一种选择。我不想告诉图像创建者将其日志存储在特定的卷/目录中。目的是在应用程序创建者编写日志文件的任何地方读取日志文件。
rexposadas 2014年

4

您可以在以下位置查看容器的文件系统

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

你可以

tail -f mylogfile.log

2
这些
Dirs

对于OSX用户,此位置将为空,因为docker将在boot2docker VM中运行,因此您必须在VM上的该位置中查找。
Michael Barton

在OSX上,日志可能位于〜/ Library / Containers / com.docker.docker / Data / com.docker.driver.amd64-linux / log / docker.log中。我正在使用docker 1.12.3。
wanghq '16

2
在我的情况下,我在以下位置找到了日志:
var/lib/docker/containers/<containerID>/<containerID>-json.log
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.