我试图将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将服务器作为服务启动?
答案 0 :(得分:0)
我想出了如何让它发挥作用,解决方案有点像问题。我试图做的很好,我只需要完整的路径来进行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
我已经测试了一下,它看起来效果很好。