我正在设置一个 Kubernetes pod,它需要与持久卷 (PV) 和持久卷声明 (PVC) 配合使用以进行数据存储。目标是将 SQLite 数据库文件复制到 pod 内的辅助目录中,但我遇到了找不到该文件的问题。这是我检查 pod 日志时收到的错误消息: 我收到错误消息
kubectl logs -f pathfinder-db-snapshot cp: can't stat '/mnt/data/pathfinder/testnet-sepolia.sqlite': No such file or directory
这是我的dockerfile
FROM alpine:3.20
RUN apk update && apk add --no-cache \
sudo \
bash \
unzip
WORKDIR /mnt/data
COPY testnet-sepolia.sqlite /mnt/data/pathfinder/testnet-sepolia.sqlite
CMD ["sh", "-c", "sudo -v && mkdir -p /mnt/data/pathfinder-2 && cp /mnt/data/pathfinder/testnet-sepolia.sqlite /mnt/data/pathfinder-2/testnet-sepolia.sqlite && tail -f /dev/null"]
如您所见,我将文件 (testnet-sepolia.sqlite) 复制到 /mnt/data/pathfinder 中,然后在 Pod 启动时尝试将其复制到另一个目录 (/mnt/data/pathfinder-2) 中。
这是使用 Docker 镜像的 pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: pathfinder-db-snapshot
spec:
containers:
- name: pathfinder-fetcher
image: test/pathfinder-db-snapshotv2
volumeMounts:
- mountPath: /mnt/data/pathfinder
name: pathfinder-volume
- mountPath: /mnt/data/pathfinder-2
name: pathfinder-volume-2
volumes:
- name: pathfinder-volume
persistentVolumeClaim:
claimName: pathfinder-pvc
- name: pathfinder-volume-2
persistentVolumeClaim:
claimName: pathfinder-pvc-2
这是PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: pathfinder-pv
spec:
capacity:
storage: 16Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: "/mnt/data/pathfinder"
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pathfinder-pv-2
spec:
capacity:
storage: 16Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: "/mnt/data/pathfinder-2"
这是PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pathfinder-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 16Gi
storageClassName: manual
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pathfinder-pvc-2
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 16Gi
storageClassName: manual
流程基本上从
kind create cluster
然后应用 pv、pvc 和 snashot-fetcher pod。
即使在 Dockerfile 中指定了文件 testnet-sepolia.sqlite,但它似乎在 pod 内不可用,或者正确安装卷时可能存在问题。
任何有关可能出现问题的指导将不胜感激!
一般来说,在 Unix 中,在目录上安装某些内容会隐藏该目录中以前的内容。 这也适用于 Docker 绑定挂载和 Kubernetes 卷挂载:您挂载到 Pod 或容器中的任何内容都会隐藏底层映像中的任何内容。 有一种未初始化的 Docker 命名卷的情况,其行为显然有所不同,但依赖它是错误的,因为它在其他环境(如 Kubernetes)中不起作用,并且它有一些极端情况(如果图像内容发生变化,它将被卷中较旧的内容隐藏)。
因此,您问题的最短答案是删除第一个覆盖图像内容的 PV/PVC/volume/volumeMount。 如果没有卷,
cp
命令的源目录将来自图像。