web-dev-qa-db-ja.com

Windows上のPostgreSQL Dockerコンテナー

次のコマンドを使用して、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

誰かが私が間違っていることを指摘できますか?

前もって感謝します。

6
cudiaco

これは、Docker for Windowsの既知の制限です。マウントはCIFS/SMBで行われるため、Windows dirからLinux dirへのLinux <-> Windowsファイルシステムマッピングセマンティクスは不完全です。 Windowsファイルシステムにマップできないため、機能しないものの1つはchown(所有者の変更)です。

おそらく、代わりに名前付きボリュームを使用する必要があります。このフォーラム投稿には詳細があります: https://forums.docker.com/t/data-directory-var-lib-postgresql-data-pgdata-has-wrong-ownership/17963/24?u=friism

9
friism

関連するgit問題のリンクの1つに部分的な解決策を投稿しました。 Postgres tablespacesを使用してデータベースオブジェクトファイルを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)。また、Dockerに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を使用しません。)

0
mdisibio

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

それが役立つかどうかわかりません。多分あなたの問題は、マッピングされたボリュームのパスが原因です。幸運を!

0
OscarAkaElvis