docker - Dockerfile 中的 VOLUME 是否在 kubernetes 中持久存在

标签 docker kubernetes dockerfile docker-volume persistent-volumes

某些 Dockerfile 有 VOLUME命令。

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

文件存储在哪里?

音量是否持久?


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

    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 对 Rancher 2.4、kubernetes 1.17 的观察)

简短回答:

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

长答案:

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

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

Where are the file stored ?

该文件是常规 Docker 卷(请参阅下面的 docker volume)

Is the volume persistent ?

不,当 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/

关于docker - Dockerfile 中的 VOLUME 是否在 kubernetes 中持久存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65036374/

相关文章:

docker - Windows Docker 容器没有 NAT IP 地址。无法在本地访问容器

haskell - Docker + Yesod链接失败

php - 尝试使用 Docker 启动已安装的 Symfony "Akeneo PIM"时,EACES 权限被拒绝

kubernetes - Kubernetes多容器Pod中的容器间通信

kubernetes - 故障转移机制在kubernetes服务中如何工作?

amazon-ec2 - 在Kubernetes从节点运行的Pod处于ContainerCreating状态

Postgresql 错误类型 ""不存在

amazon-web-services - Terraform 可以通过remote_exec 命令设置变量吗?

docker - Docker-compose多个端口公开

Docker Compose 与一个终止容器