Kubernetes挂载Persistent Volume后找不到start.sh问题排查
问题原因
你直接将Persistent Volume挂载到/home/django/目录,会完全覆盖容器镜像中原有的该目录内容。由于PV初始状态为空,原本存在于镜像/home/django/下的start.sh被覆盖,导致容器启动时找不到脚本。
解决方案
方案1:挂载子目录(推荐)
通常Django应用仅需持久化特定子目录(如静态文件、媒体文件、数据存储目录),无需挂载整个/home/django/。修改Deployment的volumeMounts配置,只挂载需要持久化的子目录:
volumeMounts: - name: django-persistent-storage mountPath: /home/django/static # 替换为实际需要持久化的子目录,比如media、data等 - name: django-persistent-storage mountPath: /home/django/media # 可添加多个需要持久化的子目录 volumes: - name: django-persistent-storage persistentVolumeClaim: claimName: django-pv-claim
此方式不会覆盖原目录下的start.sh,容器可正常启动,同时实现指定内容的持久化。
方案2:必须挂载整个/home/django/的处理
如果业务需求要求挂载整个目录,需将镜像中的start.sh同步到PV中:
- 启动临时Pod挂载目标PVC,用于复制脚本:
kubectl run temp-pod --image=busybox -it --rm --volume=name=django-persistent-storage,persistentVolumeClaim=claimName=django-pv-claim - 进入临时Pod后,将
start.sh内容写入PV目录,并赋予执行权限:
也可先启动一个不挂载PV的Pod,用# 粘贴原镜像中start.sh的内容到此处 cat > /home/django/start.sh << 'EOF' # 原start.sh的脚本内容 EOF chmod +x /home/django/start.shkubectl cp将原镜像中的start.sh拷贝到本地,再拷贝到临时Pod的PV目录中。
迁移到Persistent Volume的正确步骤
- 明确容器内需要持久化的具体路径,避免直接挂载应用根目录
- 配置Deployment挂载对应子目录到PV
- 首次使用PV时,同步容器中原有的持久化内容到PV(如静态文件、数据库文件)
- 启动Pod后查看日志,验证应用是否正常运行
内容的提问来源于stack exchange,提问作者MrTux01
相关产品推荐
相关产品推荐

