将Init容器迁移至Kubernetes Job后start.sh无法执行求助
问题:Kubernetes Job未执行Dockerfile中定义的start.sh脚本
我们正将Init容器迁移至Kubernetes Job,已在job.yaml的containers字段中配置了Init容器的镜像地址,但该容器Dockerfile中定义的start.sh脚本未被执行。
相关配置文件
job.yaml
apiVersion: batch/v1 kind: Job metadata: name: "{{ .Release.Name }}-init-job" namespace: {{ .Release.Namespace }} spec: template: metadata: annotations: linkerd.io/inject: disabled "helm.sh/hook-delete-policy": before-hook-creation "helm.sh/hook": pre-install,pre-upgrade,pre-delete "helm.sh/hook-weight": "-5" spec: serviceAccountName: {{ .Release.Name }}-init-service-account containers: - name: app-installer image: artifactorylocation/test-init-container:1.0.1 command: - /bin/bash - -c - echo Hello executing k8s init-container securityContext: readOnlyRootFilesystem: true restartPolicy: OnFailure
test-init-container的Dockerfile
FROM repository/java17-ol8-x64:adddd4c WORKDIR / ADD target/test-init-container-ms.jar ./ ADD target/lib ./lib ADD start.sh / RUN chmod +x /start.sh CMD ["sh", "/start.sh"] EXPOSE 8080
问题原因
Kubernetes容器配置中的command字段会完全覆盖Dockerfile里定义的CMD指令。当前job.yaml里的command指定执行echo Hello executing k8s init-container,根本没有调用start.sh,自然不会执行脚本。
另外需要注意:当前配置了readOnlyRootFilesystem: true,如果start.sh所在路径没有可执行权限会导致脚本无法运行,但这不是当前问题的核心原因。
解决方法
方法1:移除自定义command(推荐)
直接删除job.yaml中containers下的command字段,Kubernetes会自动使用Dockerfile中定义的CMD来启动容器,从而执行start脚本:
containers: - name: app-installer image: artifactorylocation/test-init-container:1.0.1 securityContext: readOnlyRootFilesystem: true
方法2:在command中直接调用start.sh
如果需要保留自定义command逻辑(比如添加前置操作),可以在command里显式调用start.sh:
command: - /bin/bash - -c - /start.sh
如果需要同时执行echo和脚本:
command: - /bin/bash - -c - echo Hello executing k8s init-container && /start.sh
内容的提问来源于stack exchange,提问作者santosh jk
相关产品推荐
相关产品推荐

