在 Docker 容器中存取 NFS 掛載目錄時出現「Operation not permitted」

我正在開發一個 Web 應用程式,需要存取 QNAP NAS 的檔案系統,並在其中編輯與建立目錄和檔案。

為了將 NFS 掛載到 docker 容器,我使用了以下的 docker compose 檔案:

services:
  app:
    ... # 其他不相關的設定
    volumes:
      - .:/app
      - "nfs-base:/Z" # 將 nfs volume 掛載到容器的 /base 目錄

volumes:
  nfs-base:
    driver: local
    driver_opts:
      type: nfs
      o: "nfsvers=4,addr=IPADDRESS_OF_THE_QNAP-NAS,rw"
      device: ":/"


建立這個 volume 時沒有出錯,且檢查容器時,:/Z/base 目錄有被建立,這表示 QNAP 檔案系統的共享資料夾 base 已經正確掛載,或者至少 docker-compose 檔案有辨識到它。

問題在於,當我檢查容器內容,以確認 :/Z/base 內的檔案是否真的有被掛載時,

當我進入容器的 /base 目錄時,出現這個錯誤:bash: cd: base/base: Operation not permitted。

此外,在容器內檢查該資料夾的權限,會顯示:

drwxrwxrwx 28 1000 root 4096 May 10 09:04 base

我猜測是權限問題導致無法存取共享資料夾的內容,但我對 QNAP 不熟悉,不知道如何設定權限。

需要注意的是,若我在同一台有 docker 容器的主機上,直接用 ssh 連線到 QNAP-NAS 的 /base 目錄,是沒有任何權限問題的(可正常存取 base 目錄下所有檔案)。

請問我該如何授權 docker 容器能讀寫 NFS 掛載的目錄?

由於您的 NAS 可以正常存取,問題可能不在 NAS 端。不過,根據您的提問,我會請我們的團隊檢查您的狀況,看看是否有什麼可以協助或分析的地方。感謝您的聯繫!

我不確定這樣做會不會有用,不過你有看過控制台裡「共用資料夾設定」區塊中的 NFS 共享設定嗎?

你可能需要確認你的共享設定允許對該磁碟區的無限制存取。這對 container(容器)來說不一定會有影響,但還是可以試試看。

我們的團隊希望您確認 NFS 權限已正確設定,包括:

  • 資料夾有啟用 NFS
  • 已允許 IP / 子網路連線
  • 已啟用唯讀/讀寫權限
  • 也請嘗試選擇「Squash no user」

另外,請測試以下對 YAML 檔案的修改是否有效:

services:
  app:
    volumes:
      - nfs-base:/base

volumes:
  nfs-base:
    driver: local
    driver_opts:
      type: nfs
      o: "addr=IPADDRESS_OF_THE_QNAP-NAS,nfsvers=4,rw"
      device: ":/base"

謝謝!