Ubuntu 22 中以守护进程方式运行的 InfluxDB 容器无法启动
Ubuntu 22 中以守护进程方式运行的 InfluxDB 容器无法启动
我之前碰到过一模一样的问题!本质是Ubuntu 22里的systemd对服务进程的管理逻辑和20版本有所不同,导致你的启动脚本刚跑完,systemd就立刻触发停止操作把容器给“干掉”了。
问题根源分析
你手动执行启动脚本没问题,是因为脚本执行完退出后,docker容器会在后台正常运行;但通过systemd服务运行时,默认情况下systemd会把启动脚本当成服务的主进程——一旦脚本执行完成退出,systemd就认为服务已经完成使命,会自动触发ExecStop里的停止脚本,把刚启动的容器直接停掉。这就是你看到日志里全是“success”但容器根本没在运行的核心原因。
快速解决方案
你只需要修改systemd单元文件的[Service]部分,添加两个关键配置,告诉systemd这个服务是一次性执行但需要保持活跃状态:
[Service] # 保留原有所有配置,新增下面两行 Type=oneshot RemainAfterExit=yes
这两个配置的作用:
Type=oneshot:告知systemd,这个服务的启动命令是一次性完成的任务,不是持续运行的守护进程RemainAfterExit=yes:让systemd在启动脚本执行完成退出后,依然标记服务为活跃状态,不会自动触发后续的停止操作
操作步骤
- 编辑你的systemd单元文件:
sudo nano /etc/systemd/system/docker-bmetry_influx_dev.service - 加入上述两行配置后保存退出
- 重新加载systemd配置:
sudo systemctl daemon-reload - 启动服务并查看状态:
sudo systemctl start docker-bmetry_influx_dev.service sudo systemctl status docker-bmetry_influx_dev.service
这时候你会看到服务状态显示为active (exited),同时docker容器也能正常运行了。
额外优化建议
如果后续想更规范地用systemd管理docker容器,可以直接把docker命令写到单元文件里,去掉中间的启动脚本,示例如下:
[Service] # 替换原有的ExecStart/ExecStop ExecStart=/usr/bin/docker run --net bridge -m 0b -p 8086:8086 -v /opt/influx/data:/var/lib/influxdb2:rw --name bmetry_influx_dev influxdb:2.7.0 ExecStop=/usr/bin/docker stop bmetry_influx_dev ExecStopPost=/usr/bin/docker rm bmetry_influx_dev # 保留其他原有配置 Restart=on-failure StartLimitInterval=20 ...
不过考虑到你用puppet管理现有脚本,修改单元文件的配置是最快捷的解决方式。
备注:内容来源于stack exchange,提问作者UncleBob




