-1

我正在寻找一种简单但可靠的方法来从 shell (bash) 检测是否在容器内运行,无论该容器是否恰好在 docker、lxc、pods 下运行...

我需要这个才能执行收集以收集systemctl status "*". 主要是我想避免像Failed to get D-Bus connection: Operation not permitted几乎肯定会在容器内发生的嘈杂故障。

期望的结果是在容器内返回成功并且没有输出,而在其他情况下运行 systemctl。

有几个类似的问题,但我发现没有一个适用于这个用例,大多数答案都是几年前的,他们只是无法提供。

4

3 回答 3

1

在我 100% 同意的@chepner 评论之后,接下来的 KISS 实施呢?

如果您想更精确,请查看man systemctl返回名称和值,is-system-running并确保避免更多可能的错误。

# Check if systemctl command is available at all
if which systemctl 2>&1 > /dev/null; then
    # Check that systemctl isn't offline
    if [ ! "$(systemctl is-system-running)" == "offline" ]; then
      systemctl status '*'
    fi
fi

测试:

  • 我的本地 ubuntu 机器:显示状态
  • systemd 完全运行的 docker 容器:显示状态
  • 安装了 systemd 但未运行的 docker 容器:空输出
  • 未安装 systemd 的 docker 容器:空输出
于 2020-02-01T18:08:48.357 回答
1

我正在使用if [ -f /.dockerenv ]; then echo "inside container"; else echo "not in container"; fidocker 运行时。

于 2020-02-01T18:12:30.163 回答
0

来自“systemctl status”的消息只是说没有 systemd 守护程序正在运行。一些脚本来检查 - cat /proc/1/cmdline | grep systemd - 在真机上。否则不行。

但是,像 Redhat "podman --systemd=true" 这样的较新方法将克服这一点,并且 systemctl 命令再次起作用。我的 docker-systemctl-replacement脚本也一样,它无处不在。

所以我猜你这里有错误的问题。该容器可能以某种方式适用于“systemctl”命令。

于 2020-02-02T17:41:26.807 回答