WSL2 和 Docker 桌面上的 Postgres 卷挂载:PGDATA 文件夹上的权限被拒绝

Posted

技术标签:

【中文标题】WSL2 和 Docker 桌面上的 Postgres 卷挂载:PGDATA 文件夹上的权限被拒绝【英文标题】:Postgres volume mounting on WSL2 and Docker desktop: Permission Denied on PGDATA folder 【发布时间】:2021-01-29 02:07:52 【问题描述】:

有一些类似的帖子,但这与在 Docker 桌面上运行带有 WSL2 后端的 Postgres 相关。 WSL2 在 Windows 上带来了完整的 Linux 体验。卷可以安装到 Windows 和 Linux 文件系统。但出于性能原因,最佳做法是使用 Linux 文件系统,请参阅docker documentation。

从 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 用户 chown 的远程文件夹(如某些 NFS 挂载),Postgres initdb 建议创建一个子目录来包含数据。

这就是我启动 Postgres 并将卷安装到 WSL2 Ubuntu 文件系统的方式:

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

我可以执行到正在运行的容器中并验证数据文件夹是否存在并且配置正确:

现在,如果我尝试从主机 (WSL2 Linux) 访问该文件夹,我将获得权限被拒绝:

如果有人能提供解决方案,我将不胜感激。现有帖子均无法解决此问题。

【问题讨论】:

【参考方案1】:

这与 PostgreSQL 无关。 Docker 容器以root 运行,因此 Docker 创建的任何目录也将属于root

【讨论】:

【参考方案2】:

当您附加到容器并列出 /var/lib/postgresql/data 下的目录时,它会将 postgres 显示为所有者。

查看官方文档here中的“Arbitrary --user Notes”部分

第二个选项“bind-mount /etc/passwd read-only from the host”对我有用。

【讨论】:

【参考方案3】:

阻碍我们在 Windows 上使用 WSL2 的两件事是:

    文件夹 c:\Program files\WindowsApps 没有将管理员帐户列为所有者 McAfee 阻止了 WSL。为了禁用阻止,我们必须删除以下规则:打开 McAfee -> 威胁防护 -> 显示高级(右上角的按钮)-> 向下滚动到规则 -> 规则名称为“Executing Subsystem for Linux”李>

【讨论】:

以上是关于WSL2 和 Docker 桌面上的 Postgres 卷挂载:PGDATA 文件夹上的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

当 Docker 桌面在 WSL2 中运行时,bash 中的长工作目录

hostconfig.json 在哪里(Docker 桌面 + WSL2 环境)

wsl2上的docker非常慢

带有 VSCode + WSL2 + Docker 的 Windows 上的 Git + SSH 密钥问题

可以在 VMWARE ESXI 上安装 docker 桌面吗?

无法连接到WSL2上的Landoop Docker容器