守护进程化的 influxdb 容器无法在 Ubuntu 22 上启动

守护进程化的 influxdb 容器无法在 Ubuntu 22 上启动

我正在尝试将服务器升级到 Ubuntu 22。除其他外,它还运行 InfluxDB 2.7 的 docker 映像。整个设置都是 puppetised,所以我不是在“升级”操作系统,而是在运行 Ubuntu 22 的新实例上设置整个系统,而旧实例运行的是 Ubuntu 20。

influxdb 容器应该作为服务运行,但我遇到了服务无法启动的问题。或者更确切地说,似乎又立即退出了。

所以我在做的事情是:容器由一个单元文件启动,但实际上该单元文件只是调用启动容器的启动脚本。单元文件如下所示:

[Unit]
Description=Daemon for bmetry_influx_dev
After=docker.service
Wants=
Requires=docker.service

[Service]
Restart=on-failure
StartLimitInterval=20
StartLimitBurst=5
TimeoutStartSec=5
RestartSec=5
Environment="HOME=/root"
SyslogIdentifier=docker-bmetry_influx_dev
ExecStart=/usr/local/bin/docker-run-bmetry_influx_dev-start.sh
ExecStop=/usr/local/bin/docker-run-bmetry_influx_dev-stop.sh

[Install]
WantedBy=multi-user.target

启动容器的脚本如下所示:

#!/usr/bin/env bash

/usr/bin/docker rm  bmetry_influx_dev >/dev/null 2>&1

/usr/bin/docker create \
--net bridge \
-m 0b \
-p 8086:8086 \
 \
-v /opt/influx/data:/var/lib/influxdb2:rw \
 \
--restart=always \
--name bmetry_influx_dev \
influxdb:2.7.0 \
 
/usr/bin/docker start  bmetry_influx_dev

没什么特别的,也没有什么火箭科学。事实上,如果我只调用那个启动脚本,容器就会启动并运行良好。但服务就是无法运行。每当我询问它的状态时,它都会显示以下内容:

docker-bmetry_influx_dev.service - Daemon for bmetry_influx_dev
     Loaded: loaded (/etc/systemd/system/docker-bmetry_influx_dev.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Tue 2023-06-20 08:09:28 UTC; 16min ago
    Process: 3880 ExecStart=/usr/local/bin/docker-run-bmetry_influx_dev-start.sh (code=exited, status=0/SUCCESS)
    Process: 3989 ExecStop=/usr/local/bin/docker-run-bmetry_influx_dev-stop.sh (code=exited, status=0/SUCCESS)
   Main PID: 3880 (code=exited, status=0/SUCCESS)
        CPU: 134ms

Jun 20 08:09:28 bmetry-influxdb.sitetest.ch systemd[1]: Started Daemon for bmetry_influx_dev.
Jun 20 08:09:28 bmetry-influxdb.sitetest.ch docker-bmetry_influx_dev[3886]: 1aef7d1501d9715736d2a2ffe0382a92a7eb26bce790d8c60de5c48daec915fb
Jun 20 08:09:28 bmetry-influxdb.sitetest.ch docker-bmetry_influx_dev[3891]: bmetry_influx_dev
Jun 20 08:09:28 bmetry-influxdb.sitetest.ch docker-bmetry_influx_dev[3991]: bmetry_influx_dev
Jun 20 08:09:28 bmetry-influxdb.sitetest.ch docker-bmetry_influx_dev[4074]: bmetry_influx_dev
Jun 20 08:09:28 bmetry-influxdb.sitetest.ch systemd[1]: docker-bmetry_influx_dev.service: Deactivated successfully.

这里有很多关于未运行的东西的成功运行的讨论,并且没有任何有用的错误消息。

通过系统日志进行搜索,出现了这个奇怪的消息:

bmetry-influxdb dockerd[688]: time="2023-06-20T08:09:28.784772033Z" level=info msg="Container failed to exit within 0s of signal 15 - using the force" container=1aef7d1501d9715736d2a2ffe0382a92a7eb26bce790d8c60de5c48daec915fb

我的意思是,使用原力是件好事,但我宁愿用它来欺骗我,在我脑子里植入一个更容易理解的错误信息。

再次强调,如果我手动调用启动脚本,容器运行不会出现问题,因此问题似乎不太可能与 docker 有关。整个设置在 Ubuntu 20 上也能正常运行,因此很可能是单元文件发生了一些变化,我认为我必须更改某物在那里,但我不知道是什么。任何帮助都非常感谢!

答案1

您已将容器配置为以分离模式运行 - 实际上是“在后台”。问题是,默认情况下,systemd 假定您正在使用服务Type=simple,这意味着如果主进程返回,它会假定服务已停止 - 这正是您的docker-run-bmetry_influx_dev-start.sh; 脚本退出,因此 systemd 认为该进程已停止并运行ExecStop代码。

有几种方法可以解决这个问题,但可能正确的方法是停止使用 systemd。尝试使用 systemd 管理 Docker 容器会遇到一些复杂问题,归根结底,你需要监控 Docker 客户端,不是您启动的容器。

如果您已设置重启策略always(您已设置),则 Docker 本身将负责在系统启动时启动容器。您不需要 systemd 来实现这一点。


运行自动在后台运行的程序的一般解决方案是使用 配置 systemd 服务Type=forking,但这在这里不起作用:容器不是从您的脚本中分叉出来的;您的脚本只是通过其 API 与 Docker 守护程序对话(并且 Docker 守护程序负责实际生成容器),因此容器对 systemd 不可见。

您可以尝试以非分离模式运行容器(最简单的方法可能是用 替换docker createdocker run删除调用docker start)并设置Type=exec,但在这种情况下,您实际上并没有监控容器——您只是在监控 Docker 客户端。客户端可能会退出而不影响容器,这可能会导致意外行为。

相关内容