gpt4 book ai didi

Docker - 替换 PID 1 时捕获日志

转载 作者:行者123 更新时间:2023-12-02 01:02:14 27 4
gpt4 key购买 nike

我一直在互联网上积极寻找与此相关的信息,但这似乎是一个有点特殊的用例。

我正在尝试部署一个在 Kubernetes/Openshift 集群中运行遗留后端的 docker 容器。

容器使用 entrypoint.sh 脚本启动,该脚本将在启动前初始化后端所需的依赖项。

我希望后端作为 PID 1 - 以使用 docker/openshift 捕获后端日志。

为此,我在 entrypoint.sh 脚本的末尾有一个 exec 命令,它启动我的后端,从而用我的后端替换了 entrypoint.sh 进程 - docker 为它分配了 PID 1。

问题:

在 entrypoint.sh 中执行 exec 的那一刻,docker 停止捕获日志,因此在执行“docker logs $MY_CONTAINER_ID”时,docker 没有从我的后端进程捕获任何日志。

进入容器后,我确实看到一切正常:

我的后端进程以 PID 1 运行,并且进程文件描述符 1/2 已正确设置为捕获我的后端进程的 STDOUT 和 STDERR。

有谁知道这是不是缺少配置的问题?或者考虑到我正在用 exec 替换 PID 1,docker 只是设计成这样工作吗?

最佳答案

我看不出你描述的有什么问题。进程 ID 1 的 stdout/stderr 应该被捕获,任何子进程如果继承了父进程(进程 ID 1)的 stdout/stderr 也将被捕获。

您可能会遇到问题的地方是,如果应用程序设置为记录到普通文件并且不使用 stdout/stderr。在这些情况下,如果他们只接受一个文件,请使用 /proc/1/fd/1 作为日志文件路径。这将导致日志消息通过进程 ID 1 的标准输出获得输出。

请注意,如果您的应用程序使用了一个日志记录框架,它想要在您给它的路径上进行自己的日志文件轮换,您将需要禁用它,您希望它继续使用相同的文件路径而不是尝试和重命名或截断它。

关于Docker - 替换 PID 1 时捕获日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com