docker - 是 Dockerfile 中的 VOLUME 在 kubernetes 中持久化
问题描述
一些 Dockerfile 有一个VOLUME命令。
当这些容器部署在 Kubernetes 中,但没有提供 Kubernetes 卷时会发生什么:没有持久卷(PV),也没有持久卷声明(PVC)?
文件存储在哪里?
音量是否持久?
例如,Docker库/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 }}
解决方案
(根据我在 Rancher 2.4 中观察到的答案,使用 Docker 的 kubernetes 1.17)
简短的回答:
/var/lib/docker/volumes/...
当 Pod 停止或重新部署时,会在其中创建和删除 Docker 卷。
长答案:
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/
推荐阅读
- r - 生成一个随机数重复“n”次的向量
- c# - 使用属性中的意外字符反序列化 Json
- python - Django中有没有办法过滤选择?
- javascript - 有没有办法不使用 React 路由器重新加载整个 html 正文?
- excel - 通过 VBA 检测 Excel 文件格式类型
- php - Laravel试图在地图函数中获取非对象的属性
- php - 运行 php 文件时如何修复“404 page not found”错误?
- macos - macOS 系统扩展:使用配置文件进行授权和签名
- c - C 中字符串的回文检查器
- reactjs - 解析错误:意外的令牌,预期的“,”与 react.js 和承诺