Javascript 将脚本输出重定向到docker日志

Javascript 将脚本输出重定向到docker日志,javascript,node.js,docker,logging,Javascript,Node.js,Docker,Logging,我有一个node.js脚本运行在node docker容器中,该容器当前将其输出转储到容器和STDOUT中的日志文件中。许多正式的docker映像允许您运行docker logs容器,以查看该容器中运行的任何内容的错误 我看到许多Docker只是捕获STD输出的引用,这是Docker logs容器看到的,但是我找不到任何关于如何从容器中运行的脚本正确设置的文档 目前,我的Dockerfile是以开发的方式设置的,最后一行是 ENTRYPOINT [ "npm", "run", "watch"]

我有一个node.js脚本运行在node docker容器中,该容器当前将其输出转储到容器和STDOUT中的日志文件中。许多正式的docker映像允许您运行docker logs容器,以查看该容器中运行的任何内容的错误

我看到许多Docker只是捕获STD输出的引用,这是Docker logs容器看到的,但是我找不到任何关于如何从容器中运行的脚本正确设置的文档

目前,我的Dockerfile是以开发的方式设置的,最后一行是

ENTRYPOINT [ "npm", "run", "watch"]
它监视我的文件中的更改,以便在容器中运行生成脚本。因此,对于开发,我当前使用docker exec-it container/bin/sh并手动执行脚本

当我使用docker logs容器时,我会看到npm构建链中的错误,但当从容器中手动运行脚本时,我的脚本中没有任何错误

我的脚本使用

process.stdout.write(data)
process.stderr.write(data)
在我为脚本完全重做Dockerfile之前,我是否正确地认为docker日志会重定向PID为1的进程中的STDOUT和STDERR,而不会重定向在不同PID上运行的任何其他进程

如果我想使用docker日志捕获脚本输出,那么只需更改入口点即可直接运行脚本

ENTRYPOINT [ "node", "myscript" ]

您的假设是close-Docker记录用于启动容器的任何进程的输出。这确实是PID 1,但是一些容器将使用伪init进程,因此主进程不会像这样运行,如果使用docker run-init,情况也是如此

在您的例子中,如果您将docker exec放入容器并运行命令,则不会记录输出,因为它将被发送到shell会话。如果将入口点更改为直接运行脚本,Docker将看到脚本的输出

或者,如果希望在不更改容器入口点的情况下将输出发送到容器日志收集器,则可以将输出发送到容器内PID 1的stdio流。例如,要将输出发送到PID 1的标准输出:

$ docker exec -it $RUNNING_CONTAINER bash
container$ echo test >> /proc/1/fd/1          # fd/1 for stdout

这个答案很好,只是输出应该指向/proc/1/fd/1 stdout而不是/proc/1/fd/0 stdin有没有办法让docker日志写入容器内的文件?这是一个非常棒的技巧。非常适合在发生故障时从运行状况检查脚本进行日志记录,因为这些脚本在您的流程之外,无法从中注销