You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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在启动脚本执行完成退出后,依然标记服务为活跃状态,不会自动触发后续的停止操作

操作步骤

  1. 编辑你的systemd单元文件:
    sudo nano /etc/systemd/system/docker-bmetry_influx_dev.service
    
  2. 加入上述两行配置后保存退出
  3. 重新加载systemd配置:
    sudo systemctl daemon-reload
    
  4. 启动服务并查看状态:
    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

火山引擎 最新活动