Kubernetes Pod内通过Docker Socket启动容器时文件夹挂载为空问题排查
问题分析与解决方案
这个问题我之前也碰到过,核心原因其实是你混淆了Docker客户端和daemon的运行上下文——咱们一步步拆解下:
为什么挂载的目录是空的?
当你在Pod里通过docker run命令操作时,这个docker只是个客户端工具,它通过你挂载的/var/run/docker.sock和节点主机上的Docker daemon通信。所有容器创建、卷挂载的操作,都是由节点上的Docker daemon执行的。
所以当你写-v ${helmChartFolder}:/chart:ro时,Docker daemon会去节点主机的文件系统里找${helmChartFolder}这个路径,而不是Pod容器内部的路径。如果节点上没有这个路径(或者路径是空的),新容器里的/chart自然就是空的——这和Pod内部的目录内容完全没关系。
解决办法
方法1:通过hostPath同步Pod目录到节点
把Pod里的${helmChartFolder}目录通过hostPath卷挂载到节点上,让节点和Pod共享这个目录的内容:
- 修改你的Pod配置,添加一个hostPath卷:
apiVersion: v1 kind: Pod spec: securityContext: runAsUser: 1000 runAsGroup: 1000 fsGroup: 998 # Group ID of docker group on the node containers: - name: someconainter image: someimage resources: requests: memory: "8G" cpu: "6" limits: memory: "10G" cpu: "8" imagePullPolicy: Always tty: true command: - cat volumeMounts: - mountPath: /var/run name: docker-sock - mountPath: /your-pod-chart-folder # Pod内部的helm chart目录路径 name: helm-chart-volume volumes: - name: docker-sock hostPath: path: /var/run - name: helm-chart-volume hostPath: path: /node-host-chart-folder # 节点上对应的目录 type: DirectoryOrCreate # 如果节点上没有这个目录就自动创建
- 在Pod里执行
docker run时,使用节点上的路径:
docker run --rm -v /node-host-chart-folder:/chart:ro ubuntu ls -lah
方法2:直接挂载Pod容器的文件系统
利用Docker的--volumes-from参数,把Pod容器的整个文件系统挂载到新创建的容器里,这样就能直接访问Pod内部的目录:
- 在Pod里先获取当前容器的ID:
CONTAINER_ID=$(cat /proc/self/cgroup | grep docker | head -n1 | awk -F/ '{print $NF}')
- 用
--volumes-from挂载Pod容器的文件系统,然后访问目标目录:
docker run --rm --volumes-from $CONTAINER_ID -w /your-pod-chart-folder ubuntu ls -lah
这里-w参数是设置新容器的工作目录为Pod里的helm chart目录,你也可以直接写ls -lah /your-pod-chart-folder。
补充说明
你之前调整-v参数或改用--mount都没用,是因为不管用哪种挂载语法,Docker daemon都是以节点主机为上下文解析路径的,问题根源不在挂载语法,而在你误解了命令的执行环境。
内容的提问来源于stack exchange,提问作者Wazery
相关产品推荐
相关产品推荐

