将数据从图像复制到 kubernetes 中的空卷

Jay*_*y J 7 docker

在 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
Run Code Online (Sandbox Code Playgroud)

就我而言,路径 /var 变空了。如何将原始数据保留在容器映像中的 /var 下?何时将卷安装到 Pod?

小智 7

添加一个 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
Run Code Online (Sandbox Code Playgroud)