【问题标题】:Redirecting script output to docker logs将脚本输出重定向到 docker 日志
【发布时间】:2019-08-21 23:46:40
【问题描述】:

我有一个 node.js 脚本在节点 docker 容器中运行,该脚本当前将其输出转储到容器和 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" ]

【问题讨论】:

    标签: javascript node.js docker logging


    【解决方案1】:

    您的假设很接近 - Docker 记录来自用于启动容器的任何进程的输出。这确实是 PID 1,但某些容器会使用“假”初始化进程,因此主进程不会像这样运行(如 Tini),如果您使用 docker run --init,情况也是如此。

    在您的情况下,如果您 docker exec 进入容器并运行命令,则不会记录输出,因为它正在发送到您的 shell 会话。如果您更改 ENTRYPOINT 以直接运行您的脚本,那么 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 日志写入容器内的文件?
    • 这是一个真棒技巧。非常适合在失败时从运行状况检查脚本记录日志,因为这些脚本在您的进程之外,否则无法退出日志
    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 2014-11-08
    • 1970-01-01
    • 2016-10-07
    • 2020-11-17
    • 2022-09-23
    • 2020-02-11
    • 2019-03-20
    相关资源
    最近更新 更多