次のコマンドを使用して、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の既知の制限です。マウントは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
関連する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を使用しません。)
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
それが役立つかどうかわかりません。多分あなたの問題は、マッピングされたボリュームのパスが原因です。幸運を!