运行shell脚本以初始化kubernetes中的pod(初始化我的db cluster)

时间:2018-01-23 13:57:10

标签: kubernetes

我需要能够运行shell脚本(我的脚本用于初始化我的数据库集群)以在Kubernetes中初始化我的pod,

我不想在我的dockerfile中创建我的脚本,因为我直接从网上获取了我的图片,所以我不想触摸它。

所以我想知道是否有办法让我的脚本进入我的一个卷,所以我可以这样执行:

spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["./init.sh"]
  restartPolicy: OnFailure

2 个答案:

答案 0 :(得分:1)

这取决于您的init脚本究竟是做什么的。但InitContainers在这种情况下应该会有所帮助。 Init容器在主应用程序容器启动之前运行,并且可以执行一些准备工作,例如创建配置文件等。

您仍然需要自己的Docker镜像,但它不必与数据库镜像相同。

答案 1 :(得分:0)

我最终决定采用我们想要运行的脚本创建配置文件的方法,然后从卷内部调用此配置文件。

这是一个简短的解释:

在我的pod.yaml文件中有一个名为“/ pgcong”的 VolumeMount ,这是docker镜像读取放在那里的任何SQL脚本并在pod启动时运行它的目录。 在 Volumes 中,我将把configmap名称(postgres-init-script-configmap)放在configmap.yaml文件中定义的配置名称。

无需使用kubernetes创建configmap, 只要将pod放在与pod.yaml相同的目录中,pod就会从configmap文件中获取配置。

我的POD yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: "{{.Values.container.name.primary}}"
  labels:
    name: "{{.Values.container.name.primary}}"
spec:
  securityContext:
    fsGroup: 26
  restartPolicy: {{default "Always" .Values.restartPolicy}}

  containers:
  - name: {{.Values.container.name.primary}}
    image: "{{.Values.image.repository}}/{{.Values.image.container}}:{{.Values.image.tag}}"
    ports:
    - containerPort: {{.Values.container.port}}
    env:
    - name: PGHOST
      value: /tmp
    - name: PG_PRIMARY_USER
      value: primaryuser
    - name: PG_MODE
      value: primary
    resources:
      requests:
        cpu: {{ .Values.resources.cpu }}
        memory: {{ .Values.resources.memory }}
    volumeMounts:
    - mountPath: /pgconf
      name: init-script
      readOnly: true
  volumes:
  - name: init-script
    configMap:
      name: postgres-init-script-configmap

我的configmap.yaml(其中包含将初始化数据库的SQL脚本):

apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-init-script-configmap
data:
  setup.sql: |-
    CREATE USER david WITH PASSWORD 'david';