在WSL2和Docker桌面上安装Postgres卷:PGDATA文件夹上的权限被拒绝

时间:2020-10-14 15:57:37

标签: postgresql docker docker-volume ubuntu-20.04 wsl-2

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

当文件从Linux文件系统绑定挂载而不是从Windows主机远程挂载时,性能会更高。因此,请避免docker运行-v / mnt / c / users:/ users(其中从Windows挂载/ mnt / c)。 相反,从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建议创建一个子目录来包含数据。 / p>

这就是我通过将卷安装到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)中访问,如果我尝试访问该文件夹,则会获得拒绝权限:

enter image description here

如果有人可以提供解决方案,我将不胜感激。现有职位均未解决此问题。

3 个答案:

答案 0 :(得分:0)

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

查看官方文档here

中的“任意-用户说明”部分

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 文件夹c:\ Program Files \ WindowsApps没有将管理员帐户列为所有者
  2. McAfee阻止了WSL。为了禁用阻止,我们必须删除以下规则:打开McAfee-> Threat Prevention-> Show Advanced(右上角的按钮)->向下滚动至Rules->规则名称为“ Executing Subsystem for Linux” li>