【问题标题】:How to read files and stdout from a running Docker container如何从正在运行的 Docker 容器中读取文件和标准输出
【发布时间】:2014-08-28 13:17:30
【问题描述】:

我将如何在我的主机中启动一个应用程序以便从正在运行的 docker 容器中读取文件和标准输出?

基本上我想这样做:

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

我该怎么做呢?更具体地说,我想去哪里;我想读取 docker 容器的日志和标准输出,并在其他地方处理这些日志。

我也愿意创建另一个 docker 容器,它可以从另一个容器中读取文件和标准输出,但我不知道这是否可能。

【问题讨论】:

    标签: logging go docker


    【解决方案1】:

    由 docker 容器启动的进程的 stdout 可通过docker logs $containerid command 获得(使用-f 使其永远运行)。另一种选择是直接通过docker remote API 流式传输日志。

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

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

    【讨论】:

    • 很好的发现。看起来拖尾容器日志是在 1.1.0 版本中引入的
    • @rexposadas -f 选项已经存在了很长时间(无论如何,在 docker 的时间范围内)。根据本期至少7个月:github.com/dotcloud/docker/issues/2997
    • 我们已经设置了一个 Cloudwatch 可以很好地存储一些日志,但它不存储标准输出日志。您的解决方案已经奏效,我们可以通过运行 docker logs 命令查看这些日志,但我们如何继续将其推送到 Cloudwatch?
    • @OndrejTokar 我对 Cloudwatch 不熟悉,但您可以通过管道将docker logs 命令传送到一个文件并监视该文件,或者直接在容器中执行该操作并将日志文件作为一个卷公开。
    • @OndrejTokar,我猜您指的是 awslogs 驱动器 (docs.docker.com/engine/admin/logging/awslogs)。在这里发布以防其他人感兴趣。
    【解决方案2】:

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

    docker start -i containerid
    

    您也可以在

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

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

    【讨论】:

      【解决方案3】:

      有点晚了,但这就是我对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"

      【讨论】:

      • 这是最好的答案!
      【解决方案4】:

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

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

      你也可以

      tail -f mylogfile.log
      

      【讨论】:

      • 那些目录对我来说是空的
      • 对于 OSX 用户,此位置将为空,因为 docker 将在 boot2docker 虚拟机中运行,因此您必须在虚拟机上查看该位置。
      • 在 OSX 上,日志可能位于 ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/docker.log我>。我正在使用 docker 1.12.3。
      • 在我的情况下,我在以下位置找到了日志:/var/lib/docker/containers//-json.log
      【解决方案5】:

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

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

      【讨论】:

      • 感谢您的建议。使用卷可能不是一种选择。我不想告诉图像创建者将他们的日志存储在特定的卷/目录中。目标是在应用程序创建者编写日志文件的任何位置读取日志文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2013-02-24
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多