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

标签 javascript node.js docker logging

我有一个在 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/

相关文章:

javascript - Chrome 扩展如何基本上 curl 其他页面?

javascript - 隐藏与删除 DOM 元素

javascript - 在 Node exec 回调响应中无法正常工作

node.js - 运行mupx部署时引发新的NodeJS错误

javascript - 使用 D3 创建 HTML 表格时,将某些数据用于行类而不是单元格

javascript - 当用户输入 HTML <input/> 时,数据存储在哪里?

javascript - Node 中无法识别 $or 运算符

javascript - 以百分比获取进程 CPU 使用率

php - Docker-全功能WordPress(WP + DB + PHPMyAdmin)

docker deploy 不会在 swarm 中发布端口