5

我想在 docker 容器完成工作时关闭机器(主机)。

我的主机操作系统是 Ubuntu。

容器可以作为--privileged=true. 那不是问题。

我设法用命令(在stackoverflow答案中找到)做到了这一点:

subprocess.run("echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger", shell=True, check=True)

这种方法的问题是 Linux 中的直接、不干净的关闭。

如果我尝试一种干净的方式作为 a shutdown now,我会收到以下错误:System has not been booted with systemd as init system (PID 1). Can't operate.

如何在我的容器中使用 shutdown 或 halt 或其他替代方法来关闭主机?

4

2 回答 2

4

对于您的特定情况,一旦 docker 退出 mikey 的解决方案就执行关闭操作简单而优雅。

对于更通用的情况,例如一堆 dockerized 微服务需要能够关闭或重新启动主机,可以使用以下方法:

在最近的 Debian 或 Ubuntu 等 systemd 系统中,///命令shutdown只是指向的符号链接,并且可以运行例如,而不仅仅是.haltpoweroffrebootsystemctlsystemctl 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

映射了这些卷后,您可以systemctl poweroff在 docker 中执行 a,主机将关闭并关闭电源。

于 2021-01-27T10:06:53.550 回答
2

除非我错过了一个未指定的约束,否则我看不出为什么你不能从 shell 的主机上执行此操作:

  • docker run image_name; shutdown now

这将要求 Dockerfile 以指定脚本的CMDor命令结尾。ENTRYPOINT

一旦容器内的脚本完成,docker run 进程将结束,shell 可以继续执行下一个命令,即shutdown now.

于 2020-08-06T04:34:05.557 回答