簡體   English   中英

PermissionError: [Errno 1] Operation not allowed: 'file.txt' -> 'symlink.txt' while using os.symlink

[英]PermissionError: [Errno 1] Operation not permitted: 'file.txt' -> 'symlink.txt' while using os.symlink

我正在使用helm charts在本地集群minikube中部署我的 kubernetes 應用程序。 我能夠掛載/home/$USER/log目錄,並通過使用 shell 命令在掛載目錄中創建和修改文件來進行驗證。

#touch /log/a
# ls
a  delete.cpp  dm

但是當我使用 python 創建符號鏈接時,它失敗了。

>>> import os
>>> os.symlink("delete.cpp", "b")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
PermissionError: [Errno 1] Operation not permitted: 'delete.cpp' -> 'b'

知道為什么符號鏈接不起作用。
我可以在不同的目錄中使用相同的代碼
在我使用的 minikube 中掛載主機目錄

minikube mount ~/log:/log 

我的部署腳本如下所示

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template: 
    metadata:
      labels:
        app: my-app
    spec:
      volumes:
      - name: log-dir
        hostPath:
            path: /log
      containers:
      - name: my-app
        image: my-image
        imagePullPolicy: never #It's local image
        volumeMounts:
        - name: log-dir
          mountPath: /log
        command: [ "/bin/bash", "-ce", "./my_app_executing_symlink" ]

根據symlink(2)上的 Linux 聯機幫助頁,當文件系統不支持符號鏈接時,您會收到該錯誤。

   EPERM  The filesystem containing linkpath does not support the
          creation of symbolic links.

minikube安裝的情況下,這聽起來當然是可能的。

如果您使用的是 minikube,則可以使用 支持 hostPathhostpath持久卷在單節點集群上進行開發和測試。

示例用法:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: example-volume
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data/log"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: example-volume
spec:
  storageClassName: standard
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  volumes:
  - name: pv0001
    persistentVolumeClaim:
      claimName: example-volume
  containers:
    - name: my-app
      image: alpine
      command: [ "/bin/sh", "-c", "sleep 10000" ]
      volumeMounts:
        - name: pv0001
          mountPath: /log

成功部署后,您將能夠在/log目錄中創建符號鏈接:

$ kubectl exec -it my-app -- /bin/sh
/log # touch a
/log # ln -s a pd
-rw-r--r--    1 root     root             0 Nov 25 17:49 a
lrwxrwxrwx    1 root     root             1 Nov 25 17:49 pd -> a

如文檔中所述:

minikube 配置為持久保存存儲在以下目錄下的文件,這些目錄是在 Minikube VM 中創建的(如果在裸機上運行,則在您的本地主機上)。 重新啟動時,您可能會丟失其他目錄中的數據。

  • /數據
  • /var/lib/minikube
  • /var/lib/docker
  • /tmp/hostpath_pv
  • /tmp/hostpath-provisioner

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM