docker 容器目录被持久卷覆盖(声明)
docker container directory gets overwritten by persistent volume (claim)
我正在本地部署 docker-for-desktop。方便以后迁移到kubernetes集群。
但是我遇到了一个问题。 docker container/pod 中的目录在使用持久卷时被覆盖。
我正在提取最新的 SonarQube 图像。预装了许多插件和质量配置文件。这正是我想要的。如果我不使用持久卷。一切都按预期工作。当我使用 pv 时,图像中的所有数据都被覆盖。我用头盔。
在我的deployment.yaml中我使用这个:
{{- if (eq .Values.volumes.usePersistent "true") }}
volumeMounts:
- mountPath: "/opt/sonarqube/data"
name: sonarqube-data
- mountPath: "/opt/sonarqube/extensions"
name: sonarqube-extensions
volumes:
- name: sonarqube-data
persistentVolumeClaim:
claimName: sonarqube-data-pv-claim
- name: sonarqube-extensions
persistentVolumeClaim:
claimName: sonarqube-extensions-pv-claim
{{- end }}
在我的storage.yaml中我使用这个:
{{- if (eq .Values.volumes.usePersistent "true") }}
kind: PersistentVolume
apiVersion: v1
metadata:
name: sonarqube-data-pv-volume
labels:
type: local
app: sonarqube-data
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/sonarqube/data"
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: sonarqube-extensions-pv-volume
labels:
type: local
app: sonarqube-extensions
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/sonarqube/extensions"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-data-pv-claim
labels:
app: sonarqube-data
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-extensions-pv-claim
labels:
app: sonarqube-extensions
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
{{- end }}
pvc 已绑定并且可以正常工作。
我需要的所有数据都在容器中的 de 'data' 和 'extensions' 文件夹中,来自图像。
例如在扩展文件夹中:
sonarqube@sonarqube-deployment-6b8bdfb766-klnwh:/opt/sonarqube/extensions/plugins$ ls
README.txt sonar-java-plugin-5.11.0.17289.jar sonar-scala-plugin-1.5.0.315.jar
sonar-csharp-plugin-7.11.0.8083.jar sonar-javascript-plugin-5.1.1.7506.jar sonar-scm-git-plugin-1.8.0.1574.jar
sonar-css-plugin-1.0.3.724.jar sonar-kotlin-plugin-1.5.0.315.jar sonar-scm-svn-plugin-1.9.0.1295.jar
sonar-flex-plugin-2.4.0.1222.jar sonar-ldap-plugin-2.2.0.608.jar sonar-typescript-plugin-1.9.0.3766.jar
sonar-go-plugin-1.1.0.1612.jar sonar-php-plugin-3.0.0.4537.jar sonar-vbnet-plugin-7.11.0.8083.jar
sonar-html-plugin-3.1.0.1615.jar sonar-python-plugin-1.13.0.2922.jar sonar-xml-plugin-2.0.1.2020.jar
sonar-jacoco-plugin-1.0.1.143.jar sonar-ruby-plugin-1.5.0.315.jar
我在 /tmp 文件夹中创建了以下目录:
- data
- extensions
- downloads
- jdbc-driver
- plugins
我知道我必须在我的 pv 中指定与在我的容器中相同的文件夹。
我检查过,所有文件夹都在我的 /tmp 文件夹中。但是都是空的。
他们的插件文件夹是空的,所有 plugin.jar 文件都不见了。
顺便说一句,我没有在最初的 post 中包含它,但我也在使用带有 pvc 的 PostgresDB。 pg-deploy.yaml:
{{- if (eq .Values.volumes.usePersistent "true") }}
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: sonarqubedb
volumes:
- name: sonarqubedb
persistentVolumeClaim:
claimName: postgres-sq-pv-claim
{{- end }}
storage.yaml:
{{- if (eq .Values.volumes.usePersistent "true") }}
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-sq-pv-volume
labels:
type: local
app: postgres-sonarqube
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/postgres-sonarqube"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-sq-pv-claim
labels:
app: postgres-sonarqube
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
{{- end }}
为避免将数据覆盖到同一目录中现有的files/content,您可以使用子路径来挂载数据和扩展目录(在下面的示例中)在现有的容器文件系统中。了解更多详情 sub-path
volumeMounts:
- mountPath: "/opt/sonarqube/data"
name: sonarqube-data
subPath: data
- mountPath: "/opt/sonarqube/extensions"
name: sonarqube-extensions
subPath: extensions
这行得通。但是,直到我对 sonarqube 正在使用的数据库执行相同操作后,它才起作用:
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: sonarqubedb
subPath: data
我正在本地部署 docker-for-desktop。方便以后迁移到kubernetes集群。
但是我遇到了一个问题。 docker container/pod 中的目录在使用持久卷时被覆盖。
我正在提取最新的 SonarQube 图像。预装了许多插件和质量配置文件。这正是我想要的。如果我不使用持久卷。一切都按预期工作。当我使用 pv 时,图像中的所有数据都被覆盖。我用头盔。
在我的deployment.yaml中我使用这个:
{{- if (eq .Values.volumes.usePersistent "true") }}
volumeMounts:
- mountPath: "/opt/sonarqube/data"
name: sonarqube-data
- mountPath: "/opt/sonarqube/extensions"
name: sonarqube-extensions
volumes:
- name: sonarqube-data
persistentVolumeClaim:
claimName: sonarqube-data-pv-claim
- name: sonarqube-extensions
persistentVolumeClaim:
claimName: sonarqube-extensions-pv-claim
{{- end }}
在我的storage.yaml中我使用这个:
{{- if (eq .Values.volumes.usePersistent "true") }}
kind: PersistentVolume
apiVersion: v1
metadata:
name: sonarqube-data-pv-volume
labels:
type: local
app: sonarqube-data
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/sonarqube/data"
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: sonarqube-extensions-pv-volume
labels:
type: local
app: sonarqube-extensions
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/sonarqube/extensions"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-data-pv-claim
labels:
app: sonarqube-data
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sonarqube-extensions-pv-claim
labels:
app: sonarqube-extensions
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
{{- end }}
pvc 已绑定并且可以正常工作。 我需要的所有数据都在容器中的 de 'data' 和 'extensions' 文件夹中,来自图像。 例如在扩展文件夹中:
sonarqube@sonarqube-deployment-6b8bdfb766-klnwh:/opt/sonarqube/extensions/plugins$ ls
README.txt sonar-java-plugin-5.11.0.17289.jar sonar-scala-plugin-1.5.0.315.jar
sonar-csharp-plugin-7.11.0.8083.jar sonar-javascript-plugin-5.1.1.7506.jar sonar-scm-git-plugin-1.8.0.1574.jar
sonar-css-plugin-1.0.3.724.jar sonar-kotlin-plugin-1.5.0.315.jar sonar-scm-svn-plugin-1.9.0.1295.jar
sonar-flex-plugin-2.4.0.1222.jar sonar-ldap-plugin-2.2.0.608.jar sonar-typescript-plugin-1.9.0.3766.jar
sonar-go-plugin-1.1.0.1612.jar sonar-php-plugin-3.0.0.4537.jar sonar-vbnet-plugin-7.11.0.8083.jar
sonar-html-plugin-3.1.0.1615.jar sonar-python-plugin-1.13.0.2922.jar sonar-xml-plugin-2.0.1.2020.jar
sonar-jacoco-plugin-1.0.1.143.jar sonar-ruby-plugin-1.5.0.315.jar
我在 /tmp 文件夹中创建了以下目录:
- data
- extensions
- downloads
- jdbc-driver
- plugins
我知道我必须在我的 pv 中指定与在我的容器中相同的文件夹。 我检查过,所有文件夹都在我的 /tmp 文件夹中。但是都是空的。 他们的插件文件夹是空的,所有 plugin.jar 文件都不见了。
顺便说一句,我没有在最初的 post 中包含它,但我也在使用带有 pvc 的 PostgresDB。 pg-deploy.yaml:
{{- if (eq .Values.volumes.usePersistent "true") }}
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: sonarqubedb
volumes:
- name: sonarqubedb
persistentVolumeClaim:
claimName: postgres-sq-pv-claim
{{- end }}
storage.yaml:
{{- if (eq .Values.volumes.usePersistent "true") }}
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-sq-pv-volume
labels:
type: local
app: postgres-sonarqube
spec:
storageClassName: manual
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/tmp/toolbox/postgres-sonarqube"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-sq-pv-claim
labels:
app: postgres-sonarqube
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
{{- end }}
为避免将数据覆盖到同一目录中现有的files/content,您可以使用子路径来挂载数据和扩展目录(在下面的示例中)在现有的容器文件系统中。了解更多详情 sub-path
volumeMounts:
- mountPath: "/opt/sonarqube/data"
name: sonarqube-data
subPath: data
- mountPath: "/opt/sonarqube/extensions"
name: sonarqube-extensions
subPath: extensions
这行得通。但是,直到我对 sonarqube 正在使用的数据库执行相同操作后,它才起作用:
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: sonarqubedb
subPath: data