Helm 升级未拾取 sed 命令对值所做的更改

问题描述 投票:0回答:1

我有一个 Azure Release 管道,它只需将微服务的 Helm Chart 部署到 k8s 集群。我正在尝试使用 sed 命令通过模式匹配来修改请求和限制的值。我已经在本地测试了它,它可以工作,甚至在 bash 任务中运行它,并且

cat
在 helm 升级任务之前检查文件,并且它已正确完成。

例如,如果values.yaml 文件有此块

resources: 
   limits:
     cpu: 4000m
     memory: 4000Mi
   requests:
     cpu: 2000m
     memory: 1500Mi

我运行这个:

sed -e '/limits:/,/requests:/ s/\(cpu: \)[^ ]*/\12000m/'     -e '/limits:/,/requests:/ s/\(memory: \)[^ ]*/\12000Mi/'     -e '/requests:/,/limits:/ {s/\(cpu: \)[^ ]*/\1900m/; s/\(memory: \)[^ ]*/\1900Mi/;}' values.yaml

最终结果是这样的:

resources: 
   limits:
     cpu: 2000m
     memory: 2000Mi
   requests:
     cpu: 900m
     memory: 900Mi

事情是,在

helm upgrade
任务之后,我尝试再次 cat 该文件,发现它没有更改,并且原始版本仍然存在。我检查了所有任务中的路径,它是正确的。

我尝试使用多个 echo 命令

echo -e "resources:" >> values.yaml
echo -e "  limits: \n    cpu: 2000m\n    memory: 2000Mi" >> values.yaml
echo -e "  requests: \n    cpu: 900m\n    memory: 900Mi" >> values.yaml

令人惊讶的是它有效吗?我不知道为什么!

sed 命令在 Azure 发布管道中无法正常工作有什么原因吗?

编辑: 需要使用

-i
标志并且效果很好!

kubernetes azure-devops sed kubernetes-helm azure-pipelines-release-pipeline
1个回答
0
投票

向社区发布解决方案和解释

-i
标志与
sed
命令一起使用是就地修改文件并确保后续
helm upgrade
任务拾取更改的正确方法。

-i
标志告诉
sed
就地编辑文件,这意味着更改直接对文件进行,而不是输出到控制台。如果没有
-i
标志,
sed
所做的更改只会输出到控制台,不会保存到文件中。

因此解决办法是

sed -i -e '/limits:/,/requests:/ s/\(cpu: \)[^ ]*/\12000m/' \
       -e '/limits:/,/requests:/ s/\(memory: \)[^ ]*/\12000Mi/' \
       -e '/requests:/,/limits:/ {s/\(cpu: \)[^ ]*/\1900m/; s/\(memory: \)[^ ]*/\1900Mi/;}' \
       values.yaml

这里,

-i
标志用于就地修改
values.yaml
文件。然后使用
sed
命令修改文件的
cpu
memory
部分的
limits
requests
值。

© www.soinside.com 2019 - 2024. All rights reserved.