web-dev-qa-db-fra.com

Docker: Montages refusés. Les chemins d'accès ... ne sont pas partagés à partir d'OS X et ne sont pas connus de Docker

La commande docker run -v /var/folders/zz/... génère l'erreur suivante.

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

Lorsque j'ouvre le partage de fichiers, je constate que/private est déjà répertorié.

Si j'essaie d'ajouter /var/folder/, il se résout en /private/var/folders, qui est un sous-ensemble de/private et, par conséquent, l'ajout est rejeté.

Pour résumer, il me semble que le répertoire /var/folders/.. est partagé par OS X en tant que sous-répertoire de /private et doit donc être connu de Docker. Toute aide pour résoudre ce problème serait appréciée.

A titre expérimental, j'ai remplacé le /private dans le partage de fichiers avec /private/var/folders et ai redémarré le menu fixe, mais le résultat n'a pas changé.

Juste pour une référence plus complète, voici le . Script sh , qui s'exécute ce script python , qui exécute à son tour la commande docker.

69
Aayush

Docker pour Mac les montages de volume se comportent différemment du système Docker de base. Cela est principalement dû au fait que Docker tente de se conformer aux directives du système de fichiers Sandbox d’Apple.

Comme indiqué dans les préférences de Docker, seuls certains chemins sont exportés par macOS.

  • /Users
  • /Volumes
  • /tmp
  • /private

File Sharing preference panel

/var dans macOS est un lien symbolique dans /private. Cela est également vrai pour /tmp:

$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /var -> private/var

Pourquoi /tmp figure-t-il dans le panneau de partage, mais /var ne l'est pas (même si les deux font partie de /private)? Docker pour Mac documentation sur les espaces de noms de systèmes de fichiers explique:

Par défaut, vous pouvez partager des fichiers directement dans /Users/, /Volumes/, /private/ et /tmp. Pour ajouter ou supprimer des arborescences de répertoires exportées vers Docker, utilisez l'onglet Partage de fichiers dans les préférences de Docker dans le menu whale -> Préférences -> Partage de fichiers. (Voir Préférences.)

Tous les autres chemins utilisés dans les montages de liaison -v proviennent de Moby Linux VM exécutant les conteneurs Docker, donc arguments tels que -v /var/run/docker.sock:/var/run/docker.sock devrait fonctionner comme prévu. Si un chemin macOS n'est pas partagé et n'existe pas dans la VM, une tentative de liaison de montage échouera plutôt que de le créer dans la VM. Les chemins qui existent déjà dans la VM et contiennent des fichiers sont réservés par Docker et ne peuvent pas être exportés à partir de macOS.

Notez que /var/run est spécifiquement mentionné ici en tant qu’endroit qui serait monté à partir de la machine virtuelle Linux, au lieu de macOS.

Lorsque vous demandez un montage en volume, les exportations de système de fichiers macOS sont d'abord vérifiées. S'il n'y a pas de correspondance, le Linux VM où Docker est en cours d'exécution est vérifié ensuite. Si aucun des deux n'a le chemin que vous avez demandé, le montage échoue.

Dans votre cas, /var n'est pas exporté par macOS. /var existe dans la machine virtuelle Linux, mais pas /var/folders. Par conséquent, le chemin d'accès n'est pas disponible et le montage échoue.

Si vous modifiez le chemin en /private/var, il réussira, car macOS exporte l'intégralité de l'arborescence du système de fichiers /private à des fins de montage.

Pour rendre les choses plus portables, vous voudrez peut-être tester la plate-forme sur laquelle vous êtes en train de tourner et, si c'est macOS, préfixez le chemin de montage avec /private.

82
Dan Lowe

Par exemple, en utilisant Portainer, cette commande fonctionne pour moi:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

Mais si je modifie le -v /var:/data du tout, cela ne fonctionnera pas. Je pense (mais pas sûr) que c'est parce que Docker essaie de faire un mkdir. Donc, si j'essaie de monter -v /var/whatever:/data, mkdir échoue car l'autorisation est insuffisante et cela ne fonctionne pas.

J'ai 2 Mac (High Sierra) et j'ai essayé sur les deux. Même problème. En outre, j'ai essayé d'utiliser le canal Docker Beta. Je pense comprendre la réponse de Dan Lowe: je mettrai à jour cette réponse si cela me convient.

2
djangofan