我有一个在 Node docker 容器中运行的 node.js 脚本,该脚本当前将其输出转储到容器和 STDOUT 内的日志文件中。许多官方 docker 镜像允许您运行 docker logs container
查看该容器中正在运行的任何内容的错误。
我看到很多引用文献都说 Docker 只是捕获 STD 输出,这就是 docker logs container
看到了,但我找不到任何有关如何从容器内运行的脚本正确设置它的文档。
目前我的 Dockerfile 是以开发方式设置的,最后一行是
ENTRYPOINT [ "npm", "run", "watch"]
它监视我的文件的更改以在容器内运行构建脚本。因此,对于开发我当前使用 docker exec -it container /bin/sh
并手动执行脚本。
当我使用docker logs container
时我看到了 npm 构建链中的错误,但从容器内手动运行脚本时却没有看到任何错误。
我的脚本使用
process.stdout.write(data)
process.stderr.write(data)
在我为我的脚本完全重做 Dockerfile 之前,我的想法是否正确 docker logs
重定向 STDOUT 和 STDERR 来自 PID 1 的进程,但不重定向在不同 PID 上运行的任何其他进程?
如果我想使用 docker logs
捕获我的脚本输出这只是更改 ENTRYPOINT
的情况。所以它直接运行我的脚本?
ENTRYPOINT [ "node", "myscript" ]
最佳答案
您的假设很接近 - Docker 记录来自用于启动容器的进程的输出。这确实是 PID 1,但有些容器会使用“假”init 进程,因此主进程不会像这样运行(如 Tini ),如果您使用 docker run --init 也会出现这种情况。
就您而言,如果您 docker exec
进入容器并运行命令,则不会记录输出,因为它会发送到您的 shell session 。如果您将 ENTRYPOINT
更改为直接运行脚本,那么 Docker 将看到脚本的输出。
或者,如果您希望将输出发送到容器日志收集器而不更改容器入口点,则可以将输出发送到容器内 PID 1 的 stdio 流。例如,要将输出发送到 PID 1 的标准输出:
$ docker exec -it $RUNNING_CONTAINER bash
container$ echo test >> /proc/1/fd/1 # fd/1 for stdout
关于javascript - 将脚本输出重定向到 docker 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55444469/