繁体   English   中英

Windows 上的 PostgreSQL docker 容器

[英]PostgreSQL docker container on Windows

我一直在尝试使用以下命令在我的 Windows 机器上运行 PostgresSQL Docker 容器并安装数据卷:

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

但是,当容器尝试启动时,我不断收到权限被拒绝错误的列表:

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

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

提前致谢。

这是 Docker for Windows 中的已知限制。 Linux <-> Windows 文件系统从 Windows 目录到 Linux 目录的映射语义并不完美,因为挂载是通过 CIFS/SMB 完成的。 行不通的一件事是chown (更改所有者),因为它无法映射到您的 Windows 文件系统。

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

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

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 VM 上的(持久性)目录 ( /var/lib/docker/basedata )。 它还告诉D:\\data\\largedb将您的 Windows D:\\data\\largedb为 Postgres 容器可见的卷/mnt/largedb (windows 目录还不需要存在。)登录 postgres 并使用 psql 或任何工具,执行以下 DDL:

CREATE TABLESPACE winhoststorage LOCATION '/mnt/largedb';
CREATE DATABASE "my_large_db" WITH TABLESPACE = "winhoststorage";

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

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

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

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

不确定它是否可以提供帮助。 也许您的问题是因为映射卷的路径。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM