Docker supervisord:是否可以将子进程stdout重定向回supervisord?

Docker supervisord:是否可以将子进程stdout重定向回supervisord?,docker,supervisord,coreos,Docker,Supervisord,Coreos,我使用supervisord作为Docker容器的入口点,如中所述, 我希望所有日志都写入标准输出,这样我就可以利用内置工具,如docker日志或systemd日志,尤其是在CoreOS上运行容器时 对于stderr,子流程有redirect\u stderr=true选项, 是否可以以某种方式将子进程stdout重定向回supervisor,而不处理实际的日志文件?您可以使用以下配置选项将程序的stdout重定向到supervisor的stdout: stdout_logfile=/dev/f

我使用supervisord作为Docker容器的入口点,如中所述, 我希望所有日志都写入标准输出,这样我就可以利用内置工具,如
docker日志
或systemd日志,尤其是在CoreOS上运行容器时


对于stderr,子流程有
redirect\u stderr=true
选项,
是否可以以某种方式将子进程stdout重定向回supervisor,而不处理实际的日志文件?

您可以使用以下配置选项将程序的stdout重定向到supervisor的stdout:

stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
说明:

  • 当进程打开
    /dev/fd/1
    (与
    /proc/self/fd/1
    相同)时,系统实际上会克隆该进程的文件描述符1(stdout)。将其用作
    stdout\u日志文件
    会导致
    supervisord
    将程序的stdout重定向到自己的stdout
  • stdout\u logfile\u maxbytes=0
    禁用日志文件旋转,这显然对stdout没有意义。不指定此选项将导致错误,因为默认值为50MB,并且supervisor不够聪明,无法检测到指定的日志文件不是常规文件
有关更多信息:


由于supervisor是一个守护进程,我不确定“stdout”是否有任何真正的意义——它没有连接到终端或任何有用的地方。接收输出的任何东西也无法区分哪个输出来自哪个子进程,这将严重限制其用途。也许您实际需要的是一种将每个输出管道化到命令的方法,也许使用命名管道(FIFO)?实际上,如果它用作Docker容器的入口点,那么它可能在前台运行。不过,关于所有输出合并在一起的观点是站得住脚的。看起来真正的问题是“我能让supervisor子进程将日志记录到服务X而不是文件吗?”实际上在将日志合并到标准输出方面做得很好,它的问题在于,它不应该在生产环境中运行,如果子进程崩溃,它也不会处理子进程的重新启动
redirect\u stderr=true
在这里也非常有用(将stderr重定向到程序上的stdout)不幸的是,在Linux4Tegra上,这给了我
spawnerr:unknown错误,为'ssh-forward_00'生成dispatchers:ENXIO
。找不到解决方法。