有一些类似的帖子,但这篇文章专门介绍在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
我可以执行进入正在运行的容器并验证数据文件夹是否存在且配置正确:
现在,从主机机器(WSL2 Linux)中,如果我尝试访问该文件夹,会收到“permission denied”(拒绝访问)的错误提示:
如果有人能提供解决方案,我将不胜感激。现有的帖子都无法解决这个问题。