在 Docker 中,当将空卷安装到容器路径时,它会将原始内容从映像复制到已安装的卷中。(如果将空卷安装到容器中存在文件或目录的目录中,则这些文件或目录将被传播(复制)到卷中。同样,如果启动容器并指定尚不存在的卷,则会为您创建一个空卷。这是预先填充另一个容器所需数据的好方法。) 来自官方页面的 Docker Volume 概述
但是,我尝试在 Kubernetes 中执行类似操作,挂载的卷将覆盖挂载路径。这是我的部署 yaml 文件的路径。
apiVersion: apps/v1
kind: Deployment
metadata:
......
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
volumeMounts:
- name: datavol
mountPath: /var
volumes:
- name: datavol
persistentVolumeClaim:
claimName: oscarv1
在我的例子中,路径 /var 已变为空。我如何才能将原始数据保留在容器镜像中的 /var 下?何时将卷安装到 pod?
答案1
添加一个使用您想要在应用程序上安装卷之前复制文件的相同映像的 init 容器。将您将在主应用程序上安装的卷安装到容器中的另一个本地目录中,然后在安装的目录中执行“cp -r”。现在,当同一映像安装此卷时,它将预先填充原始内容和新内容。
apiVersion: apps/v1
kind: Deployment
metadata:
...
spec:
...
template:
...
spec:
initContainers:
- name: init-ngix
image: nginx:1.13
command: ["/bin/sh", "-c", "cp -R /var/* /tmp/"]
volumeMounts:
- name: datavol
mountPath: /tmp
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
volumeMounts:
- name: datavol
mountPath: /var
volumes:
- name: datavol
persistentVolumeClaim:
claimName: oscarv1