【问题标题】:are VOLUME in Dockerfile persistent in kubernetes是 Dockerfile 中的 VOLUME 在 kubernetes 中持久化
【发布时间】:2021-03-10 04:18:35
【问题描述】:

一些 Dockerfile 有一个VOLUME 命令。

当这些容器部署在 Kubernetes 中,但没有提供 Kubernetes 卷时会发生什么:没有持久卷 (PV),也没有持久卷声明 (PVC)?

文件存储在哪里?

音量是否持久?


例如,Docker 的library/postgreSQL 容器镜像的 Dockerfile 镜像有:

    VOLUME /var/lib/postgresql/data

stable/postgresql helm 图表不会总是创建 PV:

kind: StatefulSet
### SNIP SNIP ###
      containers:
        - name: {{ template "postgresql.fullname" . }}
          image: {{ template "postgresql.image" . }}
### SNIP SNIP ###
          volumeMounts:
            {{ if .Values.persistence.enabled }}
            - name: data
              mountPath: {{ .Values.persistence.mountPath }}
              subPath: {{ .Values.persistence.subPath }}
{{- end }}
### SNIP SNIP ###
{{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
        - name: data
          persistentVolumeClaim:
{{- with .Values.persistence.existingClaim }}
            claimName: {{ tpl . $ }}
{{- end }}
{{- else if not .Values.persistence.enabled }}
        - name: data
          emptyDir: {}
{{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
  volumeClaimTemplates:
    - metadata:
        name: data
      {{- with .Values.persistence.annotations }}
        annotations:
        {{- range $key, $value := . }}
          {{ $key }}: {{ $value }}
        {{- end }}
      {{- end }}
      spec:
        accessModes:
        {{- range .Values.persistence.accessModes }}
          - {{ . | quote }}
        {{- end }}
        resources:
          requests:
            storage: {{ .Values.persistence.size | quote }}
        {{ include "postgresql.storageClass" . }}
{{- end }}

【问题讨论】:

    标签: docker kubernetes dockerfile docker-volume persistent-volumes


    【解决方案1】:

    (基于我在 Rancher 2.4 中观察到的答案,使用 Docker 的 kubernetes 1.17)

    简答

    一个 Docker 卷在 /var/lib/docker/volumes/... 中创建,并在 Pod 停止或重新部署时删除。

    长答案

    Kubernetes 似乎对 Dockerfile 中容器 / 的体积一无所知。似乎没有创建任何 Kubernetes 对象。

    当 Kubernetes 告诉 Docker 守护进程启动一个容器时,Docker 会创建一个卷(如 docker volume create)并附加创建的卷(除非 kubernete 提供了一个卷来挂载)。

    文件存储在哪里?

    该文件是一个常规的 Docker 卷(参见下面的docker volume

    音量是否持久?

    不,移除 pod 时会移除 docker 卷(就像您运行 docker rm $mycontainer --volumes 一样)


        docker inspect 6ce5f52186d4 | grep '"Driver": "local"' -A5 -B5
    
                {
                    "Type": "volume",
                    "Name": "679135a23430ceea6adb8d89e04c6baf9da33239a83ecb4c4ec3263e2c925d39",
                    "Source": "/var/lib/docker/volumes/679135a23430ceea6adb8d89e04c6baf9da33239a83ecb4c4ec3263e2c925d39/_data",
                    "Destination": "/var/lib/postgresql/data",
                    "Driver": "local",
                    "Mode": "",
                    "RW": true,
                    "Propagation": ""
                }
    
     $ docker volume ls
    DRIVER              VOLUME NAME
    local               679135a23430ceea6adb8d89e04c6baf9da33239a83ecb4c4ec3263e2c925d39
    
     $ du -hs /var/lib/docker/volumes/679135a23430ceea6adb8d89e04c6baf9da33239a83ecb4c4ec3263e2c925d39/
    51.4M   /var/lib/docker/volumes/679135a23430ceea6adb8d89e04c6baf9da33239a83ecb4c4ec3263e2c925d39/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      相关资源
      最近更新 更多