templates - 如何动态地将代码添加到 Go 模板

标签 templates go

我有一个如下的模板

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "mychart.name" . }}
    helm.sh/chart: {{ include "mychart.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "mychart.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "mychart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
<-------------------------- Here --------------------------------->
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}


我想在 imagePullPolicy 行下方添加以下代码。有任何想法吗 ?
env:
    - name: NODE_ENV
      value: "{{ .Values.node_env }}"

背景:
上述代码片段是 helm 生成的 deployment.yaml 文件,用于将应用程序部署到 Kubernetes。
基本上我想要实现的是制作一个可以在 helm chart 中设置所有这些东西的脚本,因此可以一次性完成添加环境变量之类的事情。

最佳答案

这是一个简化的例子。 define s 和 end s 与模板内容在同一行,以避免多余的空行。

主要.yaml:

{{define "main"}}apiVersion: apps/v1
spec:
  template:
    spec:
      containers:
        - name: foo
{{template "env" .Values}}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
{{end}}

环境.yaml:
{{define "env"}}          env:
            - name: NODE_ENV
              value: "{{ .node_env }}"{{end}}

main.go:
package main

import (
    "log"
    "os"
    "text/template"
)

type Deployment struct {
    Values map[string]string
}

func main() {
    dep := Deployment{Values: map[string]string{
        "node_env": "PROD",
    }}

    tmpl, err := template.ParseFiles("main.yaml", "env.yaml")
    if err != nil {
        log.Fatal(err)
    }

    tmpl.ExecuteTemplate(os.Stdout, "main", dep)
    if err != nil {
        log.Fatal(err)
    }
}

关于templates - 如何动态地将代码添加到 Go 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58110178/

相关文章:

go - 如何将 interface{} 转换为 Golang 中的嵌套树

mongodb - 使用 gopkg.in/mgo.v2 检查 mongo 中的对象是否存在

c++ - 为什么模板只能在头文件中实现?

javascript - 渲染 JavaScript 模板

gcc - 通过 Windows cgo->gcc->ld 进行 DLL 链接会出现 "undefined-reference-to-(function)"错误

arrays - GOLang 解码 JSON(未拾取简单数组)

c++ - 模板<int v>类Foo的父类(super class)

c++ - 如何专门化模板构造函数模板化?

templates - Elasticsearch 未使用logstash中的已定义模板进行映射

reflection - 使类型指向带有反射的指针