我需要能够运行shell脚本(我的脚本用于初始化我的数据库集群)以在Kubernetes中初始化我的pod,
我不想在我的dockerfile中创建我的脚本,因为我直接从网上获取了我的图片,所以我不想触摸它。
所以我想知道是否有办法让我的脚本进入我的一个卷,所以我可以这样执行:
spec:
containers:
- name: command-demo-container
image: debian
command: ["./init.sh"]
restartPolicy: OnFailure
答案 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';