[英]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 映像文檔中說明的:
PGDATA 這個可選變量可用於為數據庫文件定義另一個位置 - 如子目錄。 默認為 /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 的兩件事是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.