Dan*_*ini 7 ubuntu shutdown docker docker-privileged
我想在 docker 容器完成作业时关闭机器(主机)。
我的主机操作系统是 Ubuntu。
容器可以作为--privileged=true. 那不是问题。
我设法使用以下命令来做到这一点(在 stackoverflow 答案中找到):
subprocess.run("echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger", shell=True, check=True)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是在 Linux 中会立即、不干净地关闭。
如果我尝试以干净的方式作为 a shutdown now,我会收到以下错误:System has not been booted with systemd as init system (PID 1). Can't operate.
如何在容器内使用 shutdown、halt 或其他替代方法来关闭主机?
对于您的特定情况,一旦 docker 退出,mikey 的解决方案就执行关闭,这是简单而优雅的。
对于更一般的情况,例如一堆需要能够关闭或重新启动主机的 Docker 化微服务,可以使用以下方法:
在像最近的 Debian 或 Ubuntu 这样的 systemd 系统中,shutdown// halt/命令只是符号链接,并且可以运行例如而不是仅仅运行.poweroffrebootsystemctlsystemctl halthalt
因此,问题就变成了如何systemctl从 docker 容器内的主机上执行命令。这可以通过映射某些卷来实现,如以下命令所示:
docker run -it --rm -v /bin/systemctl:/bin/systemctl -v /run/systemd/system:/run/systemd/system -v /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket -v /sys/fs/cgroup:/sys/fs/cgroup debian:10 systemctl --no-pager status
Run Code Online (Sandbox Code Playgroud)
映射这些卷后,您只需systemctl poweroff从 docker 中执行一个命令,主机就会关闭并断电。
除非我缺少未指定的约束,否则我不明白为什么不能从 shell 在主机上执行此操作:
docker run image_name; shutdown nowCMD这需要 Dockerfile 以or命令结尾ENTRYPOINT,该命令指定脚本。
一旦容器内的脚本完成,docker run 进程将结束,并且 shell 可以移动到下一个命令,即shutdown now.