首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过在主机的某个docker容器上执行命令来关闭主机?

是否可以通过在主机的某个docker容器上执行命令来关闭主机?
EN

Stack Overflow用户
提问于 2017-03-08 08:08:48
回答 1查看 7.9K关注 0票数 9

我有一个主机,它有一个docker容器。容器处于活动状态,并且正在运行特定的服务。在满足特定条件时,我希望移除容器并关闭机器。这样做是可能的吗?我计划修改运行服务的代码来处理机器的关闭?欢迎提出任何建议!

EN

回答 1

Stack Overflow用户

发布于 2017-03-08 10:53:57

运行干净关机将依赖于主机的init系统。

为了避免授予容器--privileged访问权限并避免在容器中安装特定于主机的初始化工具,您可以创建一个接口来通知主机关闭,而不是尝试让容器运行关闭。

一个接口

有很多方法可以做到这一点。一个简单的起点可以是一个挂载的卷,以便在容器和主机之间共享数据。现在一个文件就可以了,但是你可以使用套接字、fifo、TCP或任何其他你想要的IPC方法。

在主机上创建一个文件,比如/var/run/shutdown_signal,并将该文件挂载到您的容器中

代码语言:javascript
复制
docker run -d -v /var/run/shutdown_signal:/shutdown_signal whatever 

当您想要关闭主机时,将一个字符串写入文件

代码语言:javascript
复制
docker exec $cid sh -c 'echo true > /shutdown_signal'

然后,您需要在主机上运行一些程序来监视该文件。

一个使用inotifywait等待文件更改的简单脚本。

代码语言:javascript
复制
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不可用,您可以轮询该文件。

代码语言:javascript
复制
while sleep 30; do
  signal=$(cat /var/run/shutdown_signal)
  ...

可怕的选择

在Linux中,还有一种更通用的内核方式可以触发立即、不干净的关机。

代码语言:javascript
复制
docker run --privileged busybox \
  sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger'

但这可能会给你带来更多的问题而不是它的价值。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42660690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档