我有一台主机,有一个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)
但这可能会给你带来更多问题而不是它的价值.
| 归档时间: |
|
| 查看次数: |
3113 次 |
| 最近记录: |