我有一台主机,上面有一个Docker容器。该容器正在运行一个特定的服务。当满足某个特定条件时,我想删除该容器并关闭主机。这可能吗?我计划修改运行服务的代码以处理关闭主机的操作。欢迎任何建议!
我有一台主机,上面有一个Docker容器。该容器正在运行一个特定的服务。当满足某个特定条件时,我想删除该容器并关闭主机。这可能吗?我计划修改运行服务的代码以处理关闭主机的操作。欢迎任何建议!
执行干净的关机将取决于主机的 init 系统。
为了避免给容器授予 --privileged
访问权限,同时也避免在容器中安装主机特定的 init 工具,您可以创建一个接口来向主机发送关机信号,而不是尝试让容器运行关机命令。
有很多方法可以实现这个目标。一个简单的起点可能是挂载卷以在容器和主机之间共享数据。现在可以使用文件,但您也可以使用套接字、FIFO、TCP 或您想要的任何其他 IPC 方法。
在主机上创建一个文件,例如 /var/run/shutdown_signal
,并将该文件挂载到容器中。
docker run -d -v /var/run/shutdown_signal:/shutdown_signal whatever
当您想关闭主机时,请将字符串写入文件中。
docker exec $cid sh -c 'echo true > /shutdown_signal'
那么您需要在主机上运行一些东西来监视该文件。
一个使用inotifywait
等待文件更改的简单脚本。
echo "waiting" > /var/run/shutdown_signal
while inotifywait -e close_write /var/run/shutdown_signal; do
signal=$(cat /var/run/shutdown_signal)
if [ "$signal" == "true" ]; then
echo "done" > /var/run/shutdown_signal
shutdown -h now
fi
done
如果 inotifywait
不可用,您可以轮询文件。
while sleep 30; do
signal=$(cat /var/run/shutdown_signal)
...
在Linux中,还有一种更普遍、更根本的方法可以立即触发不干净的关机。
docker run --privileged busybox \
sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger'
但是这可能会给你带来比它的价值更多的问题。