簡體   English   中英

在 WSL2 和 Docker 桌面上安裝 Postgres 卷:PGDATA 文件夾上的權限被拒絕

[英]Postgres volume mounting on WSL2 and Docker desktop: Permission Denied on PGDATA folder

有一些類似的帖子,但這與在 Docker 桌面上運行帶有 WSL2 后端的 Postgres 相關。 WSL2 在 Windows 上帶來了完整的 Linux 體驗。 卷可以掛載到 Windows 和 Linux 文件系統。 但最佳實踐是出於性能原因使用 Linux 文件系統,請參閱docker 文檔

當文件從 Linux 文件系統綁定掛載而不是從 Windows 主機遠程安裝時,性能要高得多。 因此避免 docker run -v /mnt/c/users:/users (其中 /mnt/c 從 Windows 掛載)。 相反,從 Linux shell 使用類似 docker run -v ~/my-project:/sources 的命令,其中 ~ 被 Linux shell 擴展為 $HOME。

我的 WSL 發行版是 Ubuntu 20.04 LTS。 我將掛載 Postgres 數據目錄綁定到 Linux 文件系統上的目錄,並且我還將 Postgres PGDATA 配置為使用子目錄,因為這是在官方 Docker 映像文檔中說明的:

PGD​​ATA 這個可選變量可用於為數據庫文件定義另一個位置 - 如子目錄。 默認為 /var/lib/postgresql/data。 如果您使用的數據卷是文件系統掛載點(如 GCE 永久磁盤)或無法被 postgres 用戶使用的遠程文件夾(如某些 NFS 掛載),則 Postgres initdb 建議創建一個子目錄來包含數據。

所以這就是我如何將卷安裝到 WSL2 Ubuntu 文件系統來啟動 Postgres:

docker run -d \
--name some-postgres -e POSTGRES_PASSWORD=root \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v ~/custom/mount:/var/lib/postgresql/data \
postgres

我可以 exec 進入正在運行的容器並驗證數據文件夾是否存在並且配置正確:

在此處輸入圖片說明

現在從主機(WSL2 Linux)如果我嘗試訪問該文件夾,我會得到權限被拒絕:

在此處輸入圖片說明

如果有人能提供解決方案,我將不勝感激。 現有帖子均無法解決該問題。

當您附加到容器並列出 /var/lib/postgresql/data 下的目錄時,它會將 postgres 顯示為所有者。

此處查看官方文檔中的“任意 --user Notes”部分

第二個選項“bind-mount /etc/passwd read-only from the host”對我有用。

這與 PostgreSQL 無關。 Docker 容器以root身份運行,因此 Docker 創建的任何目錄也屬於root

阻礙我們在 Windows 上使用 WSL2 的兩件事是:

  1. 文件夾 c:\\Program files\\WindowsApps 沒有將管理員帳戶列為所有者
  2. McAfee 阻止了 WSL。 為了禁用阻止,我們必須刪除以下規則:打開 McAfee -> 威脅防護 -> 顯示高級(右上角的按鈕)-> 向下滾動到規則 -> 規則名稱是“Executing Subsystem for Linux”

暫無
暫無

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

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