如何在docker-for-desktop上访问PersistentVolume文件?

时间:2019-02-13 17:47:34

标签: docker kubernetes docker-volume persistent-volumes

我想在本地计算机(macOS)上的Kubernetes PersistentVolume 中访问和编辑文件,但我不知道在哪里可以找到这些文件!

我将我的hostPath指向/tmp/wordpress-volume,但是我找不到它。我想念的隐藏秘密是什么

我在 docker-for-desktop 群集Version 2.0.0.2 (30215)上使用以下配置。

PersistentVolume

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  hostPath:
    path: /tmp/wordpress-volume

PersistentVolumeClaim

kind: PersistentVolumeClaim
metadata:
  name: wordpress-volume-claim
# ...

部署

kind: Deployment
metadata:
  name: wordpress
# ...
spec:
  containers:
  - image: wordpress:4.8-apache
    # ...
    volumeMounts:
    - name: wordpress-volume
      mountPath: /var/www/html
  volumes:
  - name: wordpress-volume
    persistentVolumeClaim:
      claimName: wordpress-volume-claim

4 个答案:

答案 0 :(得分:1)

首先,您需要记住的是Kubernetes在minikube集群上运行。 minikube本身在虚拟机上运行。这样,该路径就不会在您的主机上,而是在虚拟机中的路径。

但是使用minikube,我们可以轻松做到这一点。首先,您必须将主机目录安装到minikube

(如果您使用的是云提供商,则可以通过某种方式创建存储。对于GCE,您可以使用gcePersistentDisk

minikube mount /path/to/dir/to/mount:/vm-mount-path

现在

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  hostPath:
    path: /vm-mount-path

如果创建此资源,则应将文件保存在主机中。

Follow this minikube documentation for more detail

答案 1 :(得分:1)

由于@ aman-tuladhar和互联网上的一些时间浪费,我发现您只需要确保为您设置storageClassName PersistentVolume PersistentVolumeClaim

根据documentation,如果您想避免 Kubernetes 动态生成 PersistentVolumes 而无需考虑您静态声明的那个,则可以设置一个空字符串{ {1}}。

就我而言,我设置了" "

PersistentVolume

storageClassName: manual

PersistentVolumeClaim

kind: PersistentVolume
metadata:
  name: wordpress-volume
spec:
  # ...
  storageClassName: manual
  hostPath:
    path: /tmp/wordpress-volume

这对于kind: PersistentVolumeClaim metadata: name: wordpress-volume-claim spec: storageClassName: manual # ... 群集是有效的(只要将docker-for-desktop设置为绝对路径)。

参考文献:

答案 2 :(得分:1)

在Mac的Docker中使用MacOS和Kubernetes的情况。如何找到基于目录的本地卷的真实位置 VM

1)创建具有唯一路径的新PersistentVolume:

blablabla.yml:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: blablabla
spec:
  storageClassName: manual
  capacity:
    storage: 1G
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/mnt/blablabla"

kubectl apply -f blablabla.yml

2)登录到虚拟机:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
# then press Enter

3)查找您的音量:

find / -name blablabla
/containers/services/docker/rootfs/mnt/blablabla # <= got it!
/containers/services/docker/tmp/upper/mnt/blablabla

4)从屏幕退出:Ctrl-a y,从屏幕分离:Ctrl-a d

注意

有时您有机会断开屏幕会话,看起来好像是乱码的stdout带有混乱的符号,stdin仍然可以正常工作。在这种情况下,请尝试终止所有屏幕会话并重新连接到第一个屏幕会话。或者只是为Mac重新启动docker。

答案 3 :(得分:0)

我创建了一个 PersistentVolume 并使用了 storageClassName(在下面的示例中为 local-storage)。确保将 path (/Users/user/data-pv1) 替换为 Mac 上的实际路径。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv1
spec:
  capacity:
    storage: 30Gi
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /Users/user/data-pv1
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - docker-desktop

如果您想访问 hostPath,您需要使用 nsenter

docker run -it --rm --privileged --pid=host alpine:edge nsenter -t 1 -m -u -n -i sh

nsenter1

docker run -it --rm --privileged --pid=host justincormack/nsenter1

并导航到以下目录:

/var/lib/k8s-pvs