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

我有一个主机,有一个docker集装箱。 容器处于活动状态并运行特定的服务。 在满足特定条件的情况下,我想移除容器并closures机器。 有可能吗? 我打算修改运行服务的代码来处理机器的closures? 任何build议,欢迎!

运行干净的closures将取决于主机init系统。

为了避免给予容器--privileged访问并避免在容器中安装特定于主机的初始化工具,可以创build一个接口来指示主机closures,而不是试图让容器运行closures。

一个接口

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

在主机上创build一个文件,说/var/run/shutdown_signal并将文件挂载到你的容器中

 docker run -d -v /var/run/shutdown_signal:/shutdown_signal whatever 

当你想closures主机时,把一个string写入文件

 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) ... 

可怕的select

还有一种更通用的内核方式来触发Linux中的立即,不干净的closures。

 docker run --privileged busybox \ sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger' 

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

你尝试过吗?

 sudo docker rm -v container sudo shutdown