【问题标题】:docker container directory gets overwritten by persistent volume (claim)docker 容器目录被持久卷覆盖(声明)
【发布时间】:2019-08-15 11:02:46
【问题描述】:

我在 docker-for-desktop 本地部署。以便我将来可以迁移到 Kubernetes 集群。

但是我遇到了一个问题。当使用持久卷时,docker 容器/pod 中的目录会被覆盖。

我正在提取最新的 SonarQube 图像。预装了许多插件和质量配置文件。这正是我想要的。如果我不使用持久卷。一切都按预期工作。当我使用 pv 时,图像中的所有数据都会被覆盖。我用 helm。

在我的 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 文件夹中。但都是空的。 他们的 plugins 文件夹是空的,所有的 plugin.jar 文件都不见了。

顺便说一句,我没有在最初的帖子中包含这个,但我也在使用带有 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 }}

【问题讨论】:

    标签: kubernetes persistent volumes


    【解决方案1】:

    为避免将数据覆盖到同一目录中的现有文件/内容中,您可以使用 subpath 将数据和扩展目录(在下面的示例中)挂载到现有的 Container 文件系统中。更多详情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
    

    【讨论】:

    • 感谢您的回复。我尝试过这个。它没有用。我应该(本地)删除 /data 和 /extensions 文件夹中的所有子文件夹吗?
    • 你可以试试看会发生什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多