2

我有以下 json

{
    "namespace": "monitoring",
    "name": "alok",
    "spec": {
        "replicas": 1,
        "template": {
            "metadata": "aaa",
            "spec": {
                "containers": [
                    {
                        "image": "practodev/test:test",
                        "env": [
                            {
                                "name":"GF_SERVER_HTTP_PORT",
                                "value":"3000"
                            },
                            {
                                "name":"GF_SERVER_HTTPS_PORT",
                                "value":"443"
                            },
                        ]
                    }
                ]
            }
        }
    }
}

如何deployment_env.json使用 jsonnet 添加?

{
    "env": [
        {
            "name":"GF_AUTH_DISABLE_LOGIN_FORM",
            "value":"false"
        },
        {
            "name":"GF_AUTH_BASIC_ENABLED",
            "value":"false"
        },

    ]
}

我需要在 spec.template.containers[0].env = deployment_env.json 下添加它

我写了下面的 jsonnet 来做到这一点。它附加了一个新元素。但我需要更改 json 中现有的第 0 个容器元素。请建议如何做。

local grafana_envs = (import 'custom_grafana/deployment_env.json');
local grafanaDeployment = (import 'nested.json') + {
    spec+: {
        template+: {
            spec+: {
                containers+: [{
                    envs: grafana_envs.env,
                }]
            }
        }
    },
};
grafanaDeployment 
4

3 回答 3

4

请参阅下面的实现,该实现允许通过其在数组env中的索引添加到现有容器。containers[]

请注意,jsonnet它更适合使用对象(即字典/映射)而不是数组,因此它需要通过人为处理std.mapWithIndex(),以便能够从其匹配索引修改条目。

local grafana_envs = (import 'deployment_env.json');

// Add extra_env to a container by its idx passed containers array
local override_env(containers, idx, extra_env) = (
  local f(i, x) = (
    if i == idx then x {env+: extra_env} else x
  );
  std.mapWithIndex(f, containers)
);
local grafanaDeployment = (import 'nested.json') + {
    spec+: {
        template+: {
            spec+: {
                containers: override_env(super.containers, 0, grafana_envs.env)
            }
        }
    },
};
grafanaDeployment 
于 2019-02-26T15:09:38.057 回答
2

替代实现,不依赖于数组索引位置,而是image值(这在此处更有意义,因为env图像实现必须理解)

local grafana_envs = (import 'deployment_env.json');

local TARGET_CONTAINER_IMAGE = 'practodev/test:test';

local grafanaDeployment = (import 'nested.json') + {
  spec+: {
    template+: {
      spec+: {
        containers: [
          // TARGET_CONTAINER_IMAGE identifies which container to modify
          if x.image == TARGET_CONTAINER_IMAGE
          then x { env+: grafana_envs.env }
          else x
          for x in super.containers
        ],
      },
    },
  },
};
grafanaDeployment
于 2019-03-06T19:05:23.553 回答
0

另一种方法std.mapWithIndex是根据列表的大小显式迭代索引。

local grafana_envs = (import 'deployment_env.json');

local grafanaDeployment = (import 'nested.json') + {
    spec+: {
        template+: {
            spec+: {
                containers: 
                    [super.containers[0] { env+: grafana_envs.env }] 
                    + 
                    [
                      super.containers[i] 
                      for i in std.range(1, std.length(super.containers) - 1)
                    ]
            }
        }
    },
};
grafanaDeployment 

如果需要修改 0 以外的特定索引,比如 5,那么他们可以通过if i == 5在循环中放置一个来实现。

于 2022-01-12T22:32:21.410 回答