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:
Maintenant, à partir de la machine hôte (WSL2 Linux), si j'essaie d'accéder à ce dossier, l'autorisation est refusée:
J'apprécierais que quelqu'un puisse fournir une solution. Aucun des messages existants n'a permis de résoudre le problème.
3 Réponses :
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.
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
.
Deux choses qui nous bloquaient le travail avec WSL2 sous Windows étaient: