不可知的bash检查检测是否在容器内运行

不可知的bash检查检测是否在容器内运行,bash,docker,containers,podman,Bash,Docker,Containers,Podman,我正在寻找一种简单但可靠的方法来检测shell(bash)是否在容器内运行,而不管该容器是否恰好在docker、lxc、pods 我需要它来执行收集以收集systemctl status“*”的输出。我主要想避免一个嘈杂的故障,比如无法获得D总线连接:不允许操作,这几乎肯定会发生在容器内部 理想的结果是在容器中返回success,而在其他情况下运行systemctl 有几个类似的问题,但我发现在这个用例中没有一个是有效的,大多数答案都有几年的历史了,而且它们确实无法给出结果。在@chepner评

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

我需要它来执行收集以收集
systemctl status“*”
的输出。我主要想避免一个嘈杂的故障,比如
无法获得D总线连接:不允许操作
,这几乎肯定会发生在容器内部

理想的结果是在容器中返回success,而在其他情况下运行systemctl


有几个类似的问题,但我发现在这个用例中没有一个是有效的,大多数答案都有几年的历史了,而且它们确实无法给出结果。

在@chepner评论之后,我100%同意,那么下面的KISS实现呢

查看
man systemctl
,如果您希望更精确,并确保避免一些可能的错误,则系统正在运行
的返回名称和值

#检查systemctl命令是否可用
如果哪个系统CTL 2>&1>/dev/null;然后
#检查systemctl是否未脱机
如果[!”$(systemctl正在系统运行)”=“脱机”];然后
systemctl状态“*”
fi
fi
测试依据:

  • 我的本地ubuntu计算机:显示状态
  • systemd完全运行的docker容器:状态显示
  • 已安装systemd但未运行的docker容器:空输出
  • 未安装systemd的docker容器:空输出

我使用的是
if[-f/.dockerenv];然后回显“容器内”;否则回显“不在容器中”;fi
用于docker运行时。

来自“systemctl status”的消息只是说没有systemd守护进程正在运行。一些脚本已经开始在真正的机器上检查-cat/proc/1/cmdline | grepsystemd。否则就不行了

然而,像Redhat“podman--systemd=true”这样的新方法将克服这一点,systemctl命令将再次工作。我的剧本也一样,到处都能用


我猜你问错问题了。对于“systemctl”命令,容器可能在某种程度上是合适的。

您可以检查这一点:您关注的问题是错误的。你不在乎你是否在一个容器里;您关心运行
systemctl status“*”
是否有意义。请参阅@tripleee fixed。我最初的意图是针对几个返回状态进行测试,但在这种情况下没有必要(根据最佳实践,我应该在同一行捕获返回;)