将非pid 1进程的输出重定向到Docker日志

9
如何将非pid 1进程的日志重定向到dockerlogs,最终目标是将其重定向到gelfdocker容器内有两个进程:
1)pid 1进程
2)非pid 1进程,将日志写入位于path的日志文件中。
参考docker文档,特别是以下内容:

官方nginx图像在/dev/stdout和/var/log/nginx/access.log之间创建符号链接,并在/dev/stderr和/var/log/nginx/error.log之间创建另一个符号链接,覆盖日志文件并导致日志被发送到相应的特殊设备。

以上内容并没有起作用,只有pid 1进程的日志被重定向到dockerlogs
执行了以下步骤:
1 在Dockerfile中运行ln -sf /dev/stdout _path_ 2 使用更新后的镜像作为容器运行。
3 docker logs -f _containerid_ 只显示pid 1进程的日志
还有另一个官方docker资源,其中指出:

Docker支持不同的日志记录驱动程序,用于存储和/或流式传输主容器进程(pid 1)的标准输出和标准错误输出日志。

这可能是看不到非pid 1进程日志的原因。
尽管如此,仍然不理解通过ln -sf /dev/stdout /var/log/mysql/error.log创建的符号链接为什么没有起作用。
1个回答

9
我在这个话题上遇到了同样的问题。我解决它的方法是,在 Docker 运行时开始“ln -s”,而不是在 Docker 构建(Dockerfile)期间。
以下是我的 shell bash 脚本。
tail -n 0 -q -F /path/folder/*.log >> /proc/1/fd/1 &

希望能有所帮助。


1
请注意,在只读容器中,您无法写入/proc/1/fd/1 - 权限被拒绝 :( - Sébastien Allamand
这个完美地运行了,即使在K8s中也是如此。kubect exec -it ... 如果你执行 echo "hi" >> /proc/1/fd/1,它会将其发送到容器的主进程。 - cgseller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接