【问题标题】:Monitoring a log file for systemd service startup监控 systemd 服务启动的日志文件
【发布时间】:2017-01-05 17:48:11
【问题描述】:

我正在尝试将 Docker 容器作为服务运行。它是跨多个不同服务器的集群服务,连接可能需要几秒钟。容器偶尔会陷入故障循环而没有真正退出容器。因此 systemd 错误地将启动报告为成功。我正在尝试使用我的单元文件中的这些内容来监视该过程:

TimeoutStartSec=60
Restart=always
RestartSec=10
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull my_container
ExecStart=/usr/bin/docker run --name %n my_container
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | grep -m 1 \"All services up and running.\" ]; do sleep 1; done

当我运行systemctl start myservice 时,需要几秒钟才能启动(似乎是因为docker pull),但相对较快地返回成功。

但是,如果我手动运行 docker logs -f myservice.service,我发现该服务在几秒钟内没有记录“所有服务都已启动并正在运行”。

我查看了https://github.com/ibuildthecloud/systemd-docker,但我对一年多没有更新的存储库持谨慎态度(似乎 Darren 正忙于 Rancher)。

那么,我的问题是:为什么我的 ExecStartPost 不起作用?有没有更好的方法直接使用 systemd 将容器作为服务启动?

【问题讨论】:

  • 你真的需要systemd吗? Docker 守护进程将保持进程运行......“运行”命令具有重启策略选项:docs.docker.com/engine/reference/run/#/…
  • 我需要在生产中运行多个相互依赖的服务,所以我想要一种干净(ish)的方式来管理它们。我不确定如何直接使用docker run。 rc.local?手动?
  • Docker 守护进程本身就是进程管理器。当您使用“-d”和“--restart=always”选项运行容器时,它将在后台运行并在失败时自动重新启动。

标签: docker service systemd


【解决方案1】:

我想出了如何让它发挥作用,而解决方案有点麻烦。我试图做的很好,我只需要 grep 和 sleep 的完整路径。

TimeoutStartSec=60
Restart=always
RestartSec=10
ExecStartPre=-/usr/bin/docker stop %n
ExecStartPre=-/usr/bin/docker rm %n
ExecStartPre=/usr/bin/docker pull my_container
ExecStart=/usr/bin/docker run --name %n my_container
ExecStartPost=until [ /usr/bin/docker logs %n 2>&1 | /bin/grep -m 1 \"String that indicates my service is up successfully\" ]; do /bin/sleep 1; done

我已经测试了一下,它似乎工作得很好。

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2015-11-17
    • 2015-06-13
    相关资源
    最近更新 更多