1
votes

Montage du volume Postgres sur WSL2 et Docker Desktop: Autorisation refusée sur le dossier PGDATA

Il existe des articles similaires, mais cela est spécifiquement lié à l'exécution de Postgres avec le backend WSL2 sur le bureau Docker. WSL2 apporte une expérience Linux complète sur Windows. Les volumes peuvent être montés sur les systèmes de fichiers Windows et Linux. Mais la meilleure pratique consiste à utiliser le système de fichiers Linux pour des raisons de performances, consultez la documentation de docker .

Les performances sont beaucoup plus élevées lorsque les fichiers sont montés en liaison depuis le système de fichiers Linux, plutôt que distants depuis l'hôte Windows. Par conséquent, évitez d'exécuter docker -v / mnt / c / users: / users (où / mnt / c est monté à partir de Windows). À la place, à partir d'un shell Linux, utilisez une commande comme docker run -v ~ / my-project: / sources où ~ est étendu par le shell Linux à $ HOME.

Ma distribution WSL est Ubuntu 20.04 LTS. Je lie le montage du répertoire de données Postgres à un répertoire sur le système de fichiers Linux et je configure également Postgres PGDATA pour utiliser un sous-répertoire, car cela est indiqué dans la documentation officielle de l'image Docker:

PGDATA Cette variable facultative peut être utilisée pour définir un autre emplacement - comme un sous-répertoire - pour les fichiers de la base de données. La valeur par défaut est / var / lib / postgresql / data. Si le volume de données que vous utilisez est un point de montage du système de fichiers (comme avec les disques persistants GCE) ou un dossier distant qui ne peut pas être attribué à l'utilisateur postgres (comme certains montages NFS), Postgres initdb recommande de créer un sous-répertoire pour contenir les données.

Voici donc comment je lance Postgres avec le montage du volume sur le système de fichiers WSL2 Ubuntu:

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

Je peux exécuter dans le conteneur en cours d'exécution et vérifier que le dossier de données existe et qu'il est configuré correctement:

entrez la description de l'image ici

Maintenant, à partir de la machine hôte (WSL2 Linux), si j'essaie d'accéder à ce dossier, l'autorisation est refusée:

entrez la description de l'image ici

J'apprécierais que quelqu'un puisse fournir une solution. Aucun des messages existants n'a permis de résoudre le problème.


0 commentaires

3 Réponses :


0
votes

Lorsque vous vous attachez au conteneur et répertoriez le répertoire sous / var / lib / postgresql / data, il affiche postgres comme propriétaire.

Consultez la section «Arbitrary --user Notes» dans la documentation officielle ici

La deuxième option "bind-mount / etc / passwd en lecture seule depuis l'hôte" a fonctionné pour moi.


0 commentaires

0
votes

Cela n'a rien à voir avec PostgreSQL. Les conteneurs Docker s'exécutent en tant que root et donc tout répertoire créé par Docker appartiendra également à root .


0 commentaires

0
votes

Deux choses qui nous bloquaient le travail avec WSL2 sous Windows étaient:

  1. Le dossier c: \ Program files \ WindowsApps n'avait pas de compte administrateur répertorié comme propriétaire
  2. McAfee bloquait le WSL. Afin de désactiver le blocage, nous avons dû supprimer la règle suivante: Ouvrez McAfee -> Threat Prevention -> Show Advanced (bouton dans le coin supérieur droit) -> faites défiler jusqu'à Rules -> le nom de la règle est "Executing Subsystem for Linux"

0 commentaires