我有一个运行服务的 docker 容器,我需要该服务将日志发送到 rsyslog。它是一个在容器中运行一组服务的 ubuntu 映像。但是,rsyslog 服务无法在此容器内启动。我无法确定原因。
运行
service rsyslog start
(此图像使用 upstart,而不是 systemd)仅返回输出 start: Job failed to start
。即使我使用 --verbose
,也没有提供更多信息。
此外,此失败的启动过程中没有任何错误日志。因为
rsyslog
是无法启动的服务,它显然没有运行,所以没有记录任何内容。我在 Upstart 的日志中也没有找到任何相关内容:/var/log/upstart/
仅包含一些成功启动的日志,以及dmesg.log
仅包含dmesg: klogctl failed: Operation not permitted
。据我所知,这是因为 docker 的限制无法真正修复。尚不清楚这是否与该问题有关。
这是有趣的一点:我有完全相同的容器在不同的主机上运行,并且它没有遇到这个问题。 Rsyslog 能够在该主机上的容器中正常启动和运行。很明显,原因是主机之间存在一些差异。但我不知道从哪里开始:主机之间有很多差异(工作的主机是我的本地 Windows 系统,故障的主机是在云环境中运行的虚拟机),所以我不知道从哪里开始了解哪些差异可能导致此问题,哪些差异不会。
我已经用尽了我所知道的一切来检查。我剩下的唯一选择就是去 stackoverflow 寻求任何想法。
这里有两个问题,真的:
有什么办法可以从启动失败中获取更多信息吗?
start
本身是一个二进制文件,而不是脚本,所以我无法打开它并编辑它。我仅依赖该命令的输出,并且它不会在任何有用的地方记录任何内容。
这两个主机之间可能有什么不同可能导致此问题?是否有确凿证据或明显的候选者需要检查?
关于容器本身,不幸的是它是第三方提供的容器,我只是对其进行修改。我无法真正改变容器的任何基本内容,例如它的入口点是
/sbin/init
(这对于 docker 容器来说是一个非常糟糕的做法,也是我所有麻烦的根本原因)。 这也会导致 docker 日志记录驱动程序出现一些问题,这就是为什么我坚持使用 syslog 作为日志记录解决方案。
有类似的问题:完全相同的容器,不同的主机,容器内的 rsyslogd 失败并显示消息
rsyslog startup failure, child did not respond within startup timeout (60 seconds)
就我而言,是我的主机
ulimits
对rsyslog设置得太严格了。
对我有帮助的(使用 docker compose 文件)是明确为容器设置 ulimits:
services:
myservice:
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
相关问题:https://github.com/rsyslog/rsyslog/issues/5158
积极的事情是:我了解到 ulimit 实际上是从 docker 主机继承到 docker 容器的。