我们知道通过`kubectl exec [-it] pod_name [-c conatiner name] -- comand`的API命令形式,可以在k8s POD的容器内执行shell命令,例如:
# 可以直接删除容器内的文件
kubectl exec pod_name [-c conatiner name] -- rm /path/to/file
但是,通过`kubectl exec pod_name [-c conatiner name] -- echo -n 1 > /path/to/file`的脚本,却并不能达到预期。
后期复盘,出现这次意外,是因为恰好`/path/to/file`在宿主机上也存在,所以,宿主机脚本执行,并没有报错。但,如果直接执行脚本报错,就没有这次的分析了:)
命令执行过后,通过查看容器内的文件,发现容器内目标文件并没有被修改,出乎了意料之外!
后来逐渐明白,这是因为出现shell脚本解析给kubectl传递命令时出现了二义性,`> /path/to/file`被作为宿主机上脚本执行结果的输出文件,而并非在容器内执行echo的输出文件!
怎么才能达到目的呢?必须让这部分shell命令,能作为字符串传递到容器内才可以,那么,就可以利用`/bin/bash -c comand`来达到目的!
# > 字符在宿主机上具有分割定界的作用
# 如果不作为字符串传递,则会被当作宿主机上shell命令的结果输出使用
kubectl exec pod_name -- /bin/bash -c 'echo -n 1 > /path/to/file'