【发布时间】:2021-04-06 21:31:01
【问题描述】:
我想从 Docker 容器中输出一个日志文件,但偶然发现了一些我不明白的东西。这两行不会失败,但只有第一行可以按我的意愿工作:
tail --follow "/var/log/my-log" &
tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/' &
检查正在运行的容器内部,我看到进程正在运行,但我只看到容器输出中第一行的输出。
Dockerfile
FROM debian:buster-slim
COPY boot.sh /
ENTRYPOINT [ "/boot.sh" ]
boot.sh
必须使其可执行 (chmod +x)!
#!/bin/sh
echo "starting"
echo "start" > "/var/log/my-log"
tail --follow "/var/log/my-log" &
tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/' &
echo "sleeping"
sleep inf
跑步
- 将以上两个文件放到一个文件夹中。
- 使用
docker build --tag pipeline .构建映像 - 使用
docker run --init --rm --name pipeline pipeline在一个终端中运行映像。在这里您还可以查看容器的输出。 - 在第二个终端中,使用
docker exec -it pipeline bash打开一个shell,然后运行例如date >> /var/log/my-log。您还可以在此处运行两个tail ...命令以查看它们应该如何工作。 - 要停止容器,请使用
docker kill pipeline。
我希望在容器的输出中找到两个tail ... 命令的输出,但它在日志文件的初始“开始”条目上已经失败。添加前缀的 tail 命令也会忽略日志文件的其他条目。
顺便说一句:我欢迎使用管道/FIFO 的解决方法,以避免从一开始就编写持久性日志文件。我仍然想了解为什么这会失败。 ;)
【问题讨论】:
-
在第二个命令中,您只是将 sed 命令运行到后台,而不是初始 tail 命令。试试 (tail --follow "/var/log/my-log" | sed -e 's/^/prefix:/') &
-
嗨@RamanSailopal!感谢您的建议,但这不起作用。另外,我不会说这就是管道的工作方式。毕竟,运行例如
htop,我验证了所有进程都在运行(即tail命令和sed),但只有独立的tail产生退出容器的任何输出。