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

4bbkushb  于 2023-06-19  发布在  Go
关注(0)|答案(6)|浏览(170)

我该如何在我的主机上启动一个应用程序,以便从正在运行的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容器,它可以从另一个容器读取文件和标准输出,但我不知道这是否可能。

wydwbb8l

wydwbb8l1#

由docker容器启动的进程的 stdout 可通过docker logs $containerid command获得(使用-f使其永远运行)。另一种选择是直接通过docker remote API流式传输日志。
为了访问日志文件(只有在必须的情况下,才考虑将日志记录到stdout或其他标准解决方案,如syslogd),您唯一的实时选项是配置一个卷(如Marcus Hughes建议的那样),以便日志存储在容器之外,并可用于从主机或其他容器进行处理。
如果您不需要实时访问日志,可以使用docker exportyou can export the files(tar格式)

tvmytwxo

tvmytwxo2#

要查看stdout,可以使用-i启动docker容器。当然,这并不能让您离开已启动的进程并浏览容器。

docker start -i containerid

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

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

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

brccelvz

brccelvz3#

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

3b6akqbq

3b6akqbq4#

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

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

你就可以

tail -f mylogfile.log
5lwkijsr

5lwkijsr5#

在Docker容器和主机系统之间,或者在不同的容器之间共享文件,最好使用volumes
让你的应用程序运行在另一个容器中可能是你最好的解决方案,因为它将确保你的整个应用程序可以很好地隔离和轻松部署。您正在尝试做的事情听起来非常接近this excellent blog post中描述的设置,请看一下!

1mrurvl1

1mrurvl16#

我在Linux上运行它。
我最终做的是删除docker run中的-t选项,然后通过tr -d管道输出以删除\r字符。
所以我有:

docker run -i <containerName> <binaryname> | tr -d '\r'

它的输出可以被捕获并存储在一个bash变量中。这其实是有道理的。

相关问题