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

Postgresql WSL2和Docker桌面上的Postgres卷装载:PGDATA文件夹上的权限被拒绝,postgresql,docker,docker-volume,ubuntu-20.04,wsl-2,Postgresql,Docker,Docker Volume,Ubuntu 20.04,Wsl 2,也有一些类似的帖子,但这与在Docker桌面上运行带有WSL2后端的Postgres特别相关。WSL2在Windows上带来了完整的Linux体验。卷可以装载到Windows和Linux文件系统。但最佳实践是出于性能原因使用Linux文件系统,请参阅 当文件从Linux文件系统绑定挂载时,而不是从Windows主机远程挂载时,性能要高得多。因此,避免docker运行-v/mnt/c/users:/users(其中/mnt/c是从Windows安装的)。 相反,在Linux shell中使用doc

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

当文件从Linux文件系统绑定挂载时,而不是从Windows主机远程挂载时,性能要高得多。因此,避免docker运行-v/mnt/c/users:/users(其中/mnt/c是从Windows安装的)。 相反,在Linux shell中使用docker run-v~/my project:/sources这样的命令,其中~由Linux shell扩展为$HOME

我的WSL发行版是Ubuntu20.04LTS。我正在将Postgres数据目录绑定到Linux文件系统上的一个目录,我还将Postgres PGDATA配置为使用子目录,因为这在Docker官方镜像文档中有说明:

PGDATA 此可选变量可用于为数据库文件定义另一个位置(如子目录)。默认值为/var/lib/postgresql/data。如果您使用的数据卷是文件系统装入点(如GCE永久磁盘)或无法发送给postgres用户的远程文件夹(如某些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)上,如果我尝试访问该文件夹,则权限被拒绝:


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

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

检查官方文档中的“任意--用户注释”部分


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

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

检查官方文档中的“任意--用户注释”部分


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

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

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

阻止我们在Windows上使用WSL2的两个因素是:

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

  • 阻碍我们在Windows上使用WSL2的两个因素是:

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