我有以下 YAML(Kubernetes 部署):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- name: myapp
image: some-app:latest
ports:
- containerPort: 80
仅使用 Nushell,我想更新名为的image
容器的值。"myapp"
"some-app:1.0.0"
有什么想法可以做到这一点吗?
我完全知道我可以使用多种其他工具,例如kubectl
and/oryq
等。——这更像是一个如何使用 Nushell 过滤和设置数组中的值的一般问题,而不是解决上述实际问题。上述示例主要是为了提供一些“具体”的东西作为示例。
我尝试过一些解决方案,但都没有真正起作用。我的目标是不必编写非常复杂的脚本来实现这一点,因为感觉我错过了一些东西。
例如,我尝试过以下方法:
open ./deployment.yaml | get spec.template.spec.containers | where name == "myapp" | update image "some-app:1.0.0" | collect | save ./deployment.yaml -f
但这会将文件的全部内容替换为:
- name: myapp
image: some-app:1.0.0
ports:
- containerPort: 80
这里有一种方法:通过迭代其项目来找到
update
下面的表格,其中只有字段的值符合您的条件:spec.template.spec.containers
each
update
image
if
name
我已经多次遇到过这种情况,无论是个人还是在 Nushell Discord 中,我只是不相信现在有一种简单的内置方法可以根据该行中的值更新表行。如果我们“逻辑地”构造数据,我们可能会使用记录
spec.template.spec.containers
而不是表,但在处理外部数据时我们通常别无选择。我之前写过一个自定义命令,可能会简化这里的事情 - 它实际上只是@pmf 答案的更“通用”形式。它允许您更新给定的表行:
作为奖励,它可以在更大的表上并行运行。
我可能需要看看是否可以将其包含在 Nushell 标准库中以方便使用:
要使用它来更新您的用例:
免责声明:我目前是 Nushell 维护者之一。