【问题标题】:How to shutdown the host (ubuntu) inside a docker container如何关闭 docker 容器内的主机(ubuntu)
【发布时间】:2020-08-05 13:59:42
【问题描述】:

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

我的主机操作系统是 Ubuntu。

容器可以以--privileged=true 运行。这不是问题。

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

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

这种方法的问题是在 Linux 中立即、不干净地关闭。

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

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

【问题讨论】:

  • 你不需要一个子进程和一个shell来打开两个伪文件并写入它们。
  • with open('/proc/sys/kernel/sysrq', 'w') as sysrq, open('/proc/sysrq-trigger') as trigger: sysrq.write('1\n'); trigger.write('o\n')

标签: docker ubuntu shutdown docker-privileged


【解决方案1】:

对于您的特定情况,在 docker 退出后执行关闭,mikey 的解决方案简单而优雅。

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

在最近的 Debian 或 Ubuntu 等 systemd 系统中,shutdown/halt/poweroff/reboot 命令只是到 systemctl 的符号链接,并且可以运行例如 systemctl halt 而不仅仅是halt.

所以问题变成了从 docker 容器中在主机上执行 systemctl 命令。这可以通过以下命令映射一些卷来实现:

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

映射这些卷后,您只需在 docker 中执行 systemctl poweroff,主机就会关闭并断电。

【讨论】:

  • 除非我添加--privileged,否则我的示例命令返回Failed to read server status: Access denied
  • 这很有可能。在我的情况下,我不需要--privileged,尝试了运行 root 或容器内的用户。老实说,我很惊讶它没有它。但可能在许多系统上都需要它。
  • 哈,我喜欢它,这真的很酷。您之前是否必须将主机 systemd 暴露给容器?
  • 不,这是第一次。
【解决方案2】:

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

  • docker run image_name; shutdown now

这需要 Dockerfile 以 CMDENTRYPOINT 命令结束,该命令指定脚本。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2014-08-10
    相关资源
    最近更新 更多