是否可以通过在其一个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