也有一些类似的帖子,但这与在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
我可以执行到正在运行的容器中,并验证数据文件夹是否存在并且配置正确:
现在从主机(WSL2 Linux)中访问,如果我尝试访问该文件夹,则会获得拒绝权限:
如果有人可以提供解决方案,我将不胜感激。现有职位均未解决此问题。
答案 0 :(得分:0)
当您附加到容器并在/ var / lib / postgresql / data下列出目录时,它将显示postgres作为所有者。
查看官方文档here
中的“任意-用户说明”部分第二个选项“从主机绑定挂载/ etc / passwd只读”对我有用。
答案 1 :(得分:0)
这与PostgreSQL无关。 Docker容器以root
的身份运行,因此Docker创建的任何目录也将属于root
。
答案 2 :(得分:0)
阻碍我们在Windows上使用WSL2的两件事是: