有人知道为什么这一个没有(显示空行):
kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST
但这个有用吗
kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'
rslzwgfq1#
能否成功运行取决于您为kube使用的映像。但一般来说,echo是一个内置的Bourne shell命令。使用此命令:
kube
echo
$ kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST
您没有示例化Bourne Shell环境,并且容器中没有echo可执行文件。结果是kubectl所做的基本上是在客户端上运行echo $KUBERNETES_SERVICE_HOST!您可以尝试运行以下示例:
kubectl
echo $KUBERNETES_SERVICE_HOST
$ kubectl exec kube -- echo $PWD
您将看到这是客户机上的主目录。而使用此命令:
$ kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'
您的环境中有一个sh可执行文件,即Bourne Shell,它可以理解Pod默认容器中给定Kubernetes环境的内置echo命令。
sh
yr9zkbsy2#
一个通常不使用sh -c的选项(如果需要)是:
sh -c
kubectl exec kube -- env | grep KUBERNETES_SERVICE_HOST
pn9klfpd3#
显示空行的原因与kubernetes或容器无关。在第一行中,$KUBERNETES_SERVICE_HOST被解释为 * 您运行的shell *。并且您不能在该shell中设置KUBERNETES_SERVICE_HOST,因此它使用了一个空字符串。根据您所看到的,我推断您正在尝试查找kubernetes容器 * 内 * 的KUBERNETES_SERVICE_HOST变量的值。您的上一个命令将为您完成此操作,我猜想下面的命令也会完成此操作。
$KUBERNETES_SERVICE_HOST
kubectl exec kube -- echo '$KUBERNETES_SERVICE_HOST'
13z8s7eq4#
在以下命令的情况下:kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST$KUBERNETES_SERVICE_HOST从您的本地环境展开。shell在执行命令之前执行 parameter expansion。使用parameter expansion,如果我们拼错了变量名或者变量没有定义,扩展仍将发生,但将导致空字符串。本地主机上未定义KUBERNETES_SERVICE_HOST,因此将导致空字符串。实际上,这是将在容器中执行的命令:kubectl exec kube -- echo当我们想要抑制所有的扩展时,我们使用单引号。所以,在这种情况下,下面的命令可以工作,因为单引号抑制了参数扩展,并且命令被原封不动地传递给容器。kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'
KUBERNETES_SERVICE_HOST
kubectl exec kube -- echo
nqwrtyyt5#
通常,使用以下命令:kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST$KUBERNETES_SERVICE_HOST将首先被展开并作为参数提供给echo。在您的环境中,这个变量可能没有被设置,因此会出现一个空行。至于命令:kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'在容器中创建shell,并指示(-c)将'echo $KUBERNETES_SERVICE_HOST'视为命令字符串
-c
'echo $KUBERNETES_SERVICE_HOST'
5条答案
按热度按时间rslzwgfq1#
能否成功运行取决于您为
kube
使用的映像。但一般来说,echo
是一个内置的Bourne shell命令。使用此命令:
您没有示例化Bourne Shell环境,并且容器中没有
echo
可执行文件。结果是kubectl
所做的基本上是在客户端上运行echo $KUBERNETES_SERVICE_HOST
!您可以尝试运行以下示例:您将看到这是客户机上的主目录。
而使用此命令:
您的环境中有一个
sh
可执行文件,即Bourne Shell,它可以理解Pod默认容器中给定Kubernetes环境的内置echo
命令。yr9zkbsy2#
一个通常不使用
sh -c
的选项(如果需要)是:pn9klfpd3#
显示空行的原因与kubernetes或容器无关。在第一行中,
$KUBERNETES_SERVICE_HOST
被解释为 * 您运行的shell *。并且您不能在该shell中设置KUBERNETES_SERVICE_HOST,因此它使用了一个空字符串。根据您所看到的,我推断您正在尝试查找kubernetes容器 * 内 * 的KUBERNETES_SERVICE_HOST变量的值。您的上一个命令将为您完成此操作,我猜想下面的命令也会完成此操作。
13z8s7eq4#
在以下命令的情况下:
kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST
$KUBERNETES_SERVICE_HOST
从您的本地环境展开。shell在执行命令之前执行 parameter expansion。使用parameter expansion,如果我们拼错了变量名或者变量没有定义,扩展仍将发生,但将导致空字符串。本地主机上未定义KUBERNETES_SERVICE_HOST
,因此将导致空字符串。实际上,这是将在容器中执行的命令:kubectl exec kube -- echo
当我们想要抑制所有的扩展时,我们使用单引号。所以,在这种情况下,下面的命令可以工作,因为单引号抑制了参数扩展,并且命令被原封不动地传递给容器。
kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'
nqwrtyyt5#
通常,使用以下命令:
kubectl exec kube -- echo $KUBERNETES_SERVICE_HOST
$KUBERNETES_SERVICE_HOST
将首先被展开并作为参数提供给echo。在您的环境中,这个变量可能没有被设置,因此会出现一个空行。至于命令:
kubectl exec kube -- sh -c 'echo $KUBERNETES_SERVICE_HOST'
在容器中创建shell,并指示(
-c
)将'echo $KUBERNETES_SERVICE_HOST'
视为命令字符串