如何从正在运行的Docker容器中读取文件和stdout

时间:2014-07-07 22:41:13

标签: logging go docker

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

基本上我想这样做:

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

我该怎么做呢?更具体地说明我试图去做的地方;我想读取docker容器的日志和stdout,并在其他地方处理这些日志。

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

5 个答案:

答案 0 :(得分:100)

docker容器启动的进程的 stdout 可以通过docker logs command使用(使用-f来永久保存)。另一种选择是直接通过docker remote API流式传输日志。

为了访问日志文件(只有在必要时,考虑记录到stdout或其他标准解决方案,如syslogd),您唯一的实时选项是configure a volume(如Marcus Hughes建议的那样),因此日志存储在容器,可从主机或其他容器进行处理。

如果您不需要实时访问日志,you can export the files(采用tar格式)docker export

答案 1 :(得分:16)

要查看标准输出,您可以使用-i启动泊坞窗容器。这当然不允许您离开已启动的进程并浏览容器。

docker start -i containerid

或者,您可以在

中查看容器的文件系统
/var/lib/docker/containers/containerid/root/

然而 这些都不是理想的。如果要查看日志或任何持久存储,使用-v时,使用docker run开关的正确方法是attaching a volume。这意味着您可以检查主机上的日志文件或将它们附加到另一个容器并在那里检查它们。

答案 2 :(得分:5)

您可以在

中查看容器的文件系统
/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

你可以

tail -f mylogfile.log

答案 3 :(得分:3)

最好使用volumes在docker容器和主机系统之间或不同容器之间共享文件。

让您的应用程序在另一个容器中运行可能是您的最佳解决方案,因为它将确保您的整个应用程序可以很好地隔离并轻松部署。您尝试做的事情听起来非常接近this excellent blog post中描述的设置,请看一下!

答案 4 :(得分:2)

有点晚了,但这就是我用journald做的事情。它非常强大。

您需要在systemd-journald的操作系统上运行docker容器。

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"