Rsyslog 无法在 docker 容器内启动

问题描述 投票:0回答:1

我有一个运行服务的 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 寻求任何想法。

这里有两个问题,真的:

  1. 有什么办法可以从启动失败中获取更多信息吗?

    start
    本身是一个二进制文件,而不是脚本,所以我无法打开它并编辑它。我仅依赖该命令的输出,并且它不会在任何有用的地方记录任何内容。

  2. 这两个主机之间可能有什么不同可能导致此问题?是否有确凿证据或明显的候选者需要检查?

关于容器本身,不幸的是它是第三方提供的容器,我只是对其进行修改。我无法真正改变容器的任何基本内容,例如它的入口点是

/sbin/init
(这对于 docker 容器来说是一个非常糟糕的做法,也是我所有麻烦的根本原因)。 这也会导致 docker 日志记录驱动程序出现一些问题,这就是为什么我坚持使用 syslog 作为日志记录解决方案。

docker rsyslog upstart
1个回答
0
投票

有类似的问题:完全相同的容器,不同的主机,容器内的 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 容器的。

© www.soinside.com 2019 - 2024. All rights reserved.