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

jos*_*kal 5 docker

我有一台主机,有一个docker容器.容器处于活动状态并运行特定服务.在满足特定条件时,我想移除容器并关闭机器.有可能这样做吗?我打算修改运行服务的代码来处理关闭机器的问题?欢迎任何建议!

Mat*_*att 11

运行干净关闭将取决于主机init系统.

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

一个接口

有很多方法可以做到这一点.一个简单的起点可以是在容器和主机之间共享数据的已安装卷.文件现在可以使用,但您可以使用套接字,fifo,TCP或任何其他所需的IPC方法.

在主机上创建一个文件,说明/var/run/shutdown_signal并将文件装入容器中

docker run -d -v /var/run/shutdown_signal:/shutdown_signal whatever 
Run Code Online (Sandbox Code Playgroud)

希望主机关闭时,将字符串写入文件

docker exec $cid sh -c 'echo true > /shutdown_signal'
Run Code Online (Sandbox Code Playgroud)

然后你需要在主机上运行一些东西来监控文件.

一个等待文件更改的简单脚本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
Run Code Online (Sandbox Code Playgroud)

如果inotifywait不可用,您可以轮询该文件.

while sleep 30; do
  signal=$(cat /var/run/shutdown_signal)
  ...
Run Code Online (Sandbox Code Playgroud)

可怕的选择

还有一种更通用的内核方法可以在Linux中立即触发不干净的关闭.

docker run --privileged busybox \
  sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger'
Run Code Online (Sandbox Code Playgroud)

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

  • >>“无论如何,一切都可以在主机中完成”这是不正确的。您认为 OP 为什么首先使用容器? (2认同)