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

3

有一些类似的帖子,但这篇文章专门介绍在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

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

enter image description here

现在,从主机机器(WSL2 Linux)中,如果我尝试访问该文件夹,会收到“permission denied”(拒绝访问)的错误提示:

enter image description here

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

3个回答

0

阻碍我们在Windows上使用WSL2的两个问题是:

  1. c:\Program files\WindowsApps文件夹没有列出管理员帐户作为所有者
  2. McAfee阻止了WSL。为了禁用阻止,我们必须删除以下规则:打开McAfee -> 威胁预防 -> 显示高级(右上角的按钮) -> 向下滚动到规则 -> 规则名称为“执行Linux子系统”

0

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

请在官方文档此处中检查“任意--user 注”部分

对我有用的第二个选项是“从主机以只读方式绑定挂载 /etc/passwd”。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接