Kubernetes中从Init容器向主容器共享文件失败:Pod无法创建的问题排查
问题分析与修复方案
首先,你的Pod创建失败的核心问题出在Init容器的挂载路径和复制命令的目标路径上,我来一步步拆解问题并给出修复方案:
1. 挂载路径覆盖了原jar文件所在目录
你的Init容器里把workdir这个emptyDir挂载到了/tmp,但自定义镜像alpine-audit里的jar文件正好存放在/tmp目录下。Kubernetes挂载Volume到容器目录时,会完全覆盖该目录下的原有内容——这就导致Init容器启动后,根本找不到/tmp/auditlogger-1.0.0.jar这个文件,复制命令执行失败,Pod自然无法创建。
2. 复制命令的目标路径错误
就算挂载路径没问题,你当前的cp命令目标是相对路径auditlogger-1.0.0.jar,它会把文件复制到Init容器的默认工作目录(一般是/),而不是挂载的workdir卷里,主容器自然也访问不到目标文件。
修复后的YAML配置
这里提供两种可行的修复方案,你可以根据需求选择:
方案一:调整Init容器的挂载路径(推荐)
把Init容器的Volume挂载到一个非/tmp的目录,比如/audit,然后修改cp命令把jar文件复制到这个挂载目录里:
apiVersion: v1 kind: Pod metadata: name: init-demo spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html initContainers: - name: install image: my.private-artifactory.com/audit/alpine-audit:0.1.0 # 把jar文件从原路径复制到挂载的Volume目录 command: ['cp', '/tmp/auditlogger-1.0.0.jar', '/audit/auditlogger-1.0.0.jar'] volumeMounts: - name: workdir # 挂载到非/tmp的目录,避免覆盖原jar文件 mountPath: "/audit" dnsPolicy: Default volumes: - name: workdir emptyDir: {}
方案二:修改cp命令的目标为挂载Volume的绝对路径
如果你一定要挂载到/tmp相关路径,可以把Volume挂载到/tmp/workdir这个子目录,避免覆盖原/tmp下的jar文件,然后修改复制命令的目标路径:
apiVersion: v1 kind: Pod metadata: name: init-demo spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html initContainers: - name: install image: my.private-artifactory.com/audit/alpine-audit:0.1.0 command: ['cp', '/tmp/auditlogger-1.0.0.jar', '/tmp/workdir/auditlogger-1.0.0.jar'] volumeMounts: - name: workdir mountPath: "/tmp/workdir" dnsPolicy: Default volumes: - name: workdir emptyDir: {}
验证方法
修复后创建Pod,等Init容器执行完成后,你可以进入主容器验证文件是否存在:
kubectl exec -it init-demo -- ls /usr/share/nginx/html
如果能看到auditlogger-1.0.0.jar,就说明配置成功了。
内容的提问来源于stack exchange,提问作者AnujAroshA
相关产品推荐
相关产品推荐

