首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows上的PostgreSQL停靠容器

Windows上的PostgreSQL停靠容器
EN

Stack Overflow用户
提问于 2017-04-20 03:15:01
回答 3查看 24.9K关注 0票数 6

我一直试图在我的Windows机上运行PostgresSQL Docker容器,并使用以下命令挂载数据卷:

代码语言:javascript
复制
docker run -p 5432:5432 -it --volume c:\Users\me\Desktop\pg\data\:/var/lib/postgresql/data postgres:latest -e POSTGRES_USER=user POSTGRES_PASSWORD=password

然而,当容器试图启动时,我一直收到权限被拒绝错误的列表:

代码语言:javascript
复制
chown: changing ownership of ‘/var/lib/postgresql/data/pg_log’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_logical/mappings’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_logical/snapshots’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_logical’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_multixact/members/0000’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_multixact/members’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_multixact/offsets/0000’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_multixact/offsets’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_multixact’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_notify/0000’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_notify’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_replslot’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_serial’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_snapshots’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_stat’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_stat_tmp/db_0.stat’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_stat_tmp/db_16395.stat’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_stat_tmp/global.stat’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_stat_tmp’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_subtrans/0000’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_subtrans’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_tblspc’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_twophase’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/PG_VERSION’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_xlog/00000001000000000000000A’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_xlog/00000001000000000000000B’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_xlog/archive_status’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/pg_xlog’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/postgresql.auto.conf’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/postgresql.conf’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/postmaster.opts’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data/postmaster.pid’: Permission denied
chown: changing ownership of ‘/var/lib/postgresql/data’: Permission denied

有人能指出我做错了什么吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-20 22:06:48

这是Docker for Windows中的已知限制。从Windows目录到Linux目录的Linux <-> Windows文件系统映射语义并不完美,因为装载是使用CIFS/SMB完成的。其中一个不起作用的事情是chown (更改所有者),因为它不能映射到您的Windows文件系统。

您可能应该改用命名卷。此论坛帖子有详细信息:https://forums.docker.com/t/data-directory-var-lib-postgresql-data-pgdata-has-wrong-ownership/17963/24?u=friism

票数 9
EN

Stack Overflow用户

发布于 2020-03-30 04:53:26

我发布了一个相关git问题链接的部分解决方案。通过使用Postgres表空间将数据库对象文件存储在windows主机系统上,可以完成部分解决方法。这不是一个完美的解决方案,因为核心数据目录(由PGDATA表示)仍然驻留在LinuxVM上。但至少您可以在Windows主机上和Linux虚拟机外部管理后续的数据库创建和文件存储。

代码语言:javascript
复制
docker run --rm --name mypostgres
           -e POSTGRES_PASSWORD=pwd
           -d -p 5432:5432 
           -v /var/lib/docker/basedata:/var/lib/postgresql/data
           -v d:/data/largedb:/mnt/largedb
           postgres

这会将默认数据存储设置为Linux (/var/lib/docker/basedata)上的一个(永久)目录。它还告诉docker将你的windows D:\data\largedb挂载为对Postgres容器可见的卷/mnt/largedb。( windows目录还不需要存在。)登录postgres,使用psql或其他工具,执行以下DDL:

代码语言:javascript
复制
CREATE TABLESPACE winhoststorage LOCATION '/mnt/largedb';
CREATE DATABASE "my_large_db" WITH TABLESPACE = "winhoststorage";

继续在my_large_db中创建表和数据。把集装箱停下来。在Windows资源管理器中导航到D:\data\largedb,您将看到数据文件。重新启动容器,您将看到前一个会话中的数据。

(注:Win10上的Docker Desktop for Windows (2.2)使用的是DockerDesktopVM,而不是MobyLinux或docker-machine。)

票数 1
EN

Stack Overflow用户

发布于 2017-04-20 04:10:23

您使用的是docker with hyper-v还是docker-toolbox?因为在我的经验中,我只使用了docker-toolbox (它使用docker-machine),要使用--volume或-v (是相同的)成功映射卷,您应该将以下命名法用于Win路径:

代码语言:javascript
复制
docker run -p 5432:5432 -it -v /c/Users/me/Desktop/pg/data:/var/lib/postgresql/data postgres:latest -e POSTGRES_USER=user POSTGRES_PASSWORD=password

不确定它能不能帮上忙。也许您的问题是由于映射卷的路径所致。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43504238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档