【问题标题】:How can an application running in a docker container detect that the docker host rebooted?在 docker 容器中运行的应用程序如何检测到 docker 主机重新启动?
【发布时间】:2020-04-15 12:54:08
【问题描述】:
我有一个应用程序 (Django) 在云提供商的 docker 容器中运行。由于各种原因,知道主机本身何时重新启动并将此事件保存在某个地方对我很有用,例如一个数据库。显然,很容易检测到应用程序本身何时启动,但这可能是由主机重启以外的其他原因引起的。
理论上我可以捕获 SIGTERM 但这并不一定意味着主机重新启动。
像往常一样,在写这个问题时,我意识到我可以打电话给uptime 并在必要时通过/proc/uptime,但这是最好的方法吗?
【问题讨论】:
标签:
docker
monitoring
uptime
【解决方案1】:
不需要通过/proc/uptime,它应该已经在容器中可用并且没有命名空间或隔离:
$ cat /proc/uptime
1545872.40 11868963.08
$ docker run -it --rm alpine cat /proc/uptime
1545882.60 11869040.00
【解决方案2】:
import time
import subprocess
def uptime():
res = subprocess.check_output(
# %Y is last data modification since Epoch
# proc/1 is the first process started in docker, PID 1
"stat --format=%Y -t /proc/1/cmdline",
shell=True,
)
uptime_seconds_epoch = int(res.decode().strip())
now_epoch = int(time.time())
uptime_seconds = now_epoch - uptime_seconds_epoch
return uptime_seconds