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

rex*_*das 72 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. 
Run Code Online (Sandbox Code Playgroud)

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

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

Abe*_*iño 108

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

要访问日志文件(只有在必须时,考虑记录到stdout或其他标准解决方案,如syslogd),您唯一的实时选项是配置卷(如Marcus Hughes建议的那样),以便将日志存储在容器外部并可用于处理来自主机或其他容器.

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

  • 好找。看起来拖尾容器日志是在 1.1.0 版本中引入的 (2认同)

Mar*_*hes 16

要查看标准输出,您可以启动docker容器-i.这当然不能让您离开已启动的进程并探索容器.

docker start -i containerid
Run Code Online (Sandbox Code Playgroud)

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

/var/lib/docker/containers/containerid/root/
Run Code Online (Sandbox Code Playgroud)

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


mae*_*tr0 6

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

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/
Run Code Online (Sandbox Code Playgroud)

你可以

tail -f mylogfile.log
Run Code Online (Sandbox Code Playgroud)

  • 那些目录对我来说是空的 (4认同)
  • 在我的情况下,我找到了日志:/var/lib/docker/containers/<containerID>/<containerID>-json.log (4认同)

Ada*_*dam 6

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

您需要在带有systemd-journald.

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

这会将所有内容导入主机的 journald,它负责处理日志修剪、存储格式等内容,并为您提供一些很酷的选项来查看它们:

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"