Docker: montures refusées. Les chemins ... ne sont pas partagés depuis 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.

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

Si je tente d'ajouter /var / folder/, il se résout en/private/var / folders, qui est un sous-ensemble de / private et donc 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 sur résoudre ce problème serait apprécié.

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

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

32
demandé sur mohan08p 2017-07-15 23:28:12

2 réponses

Docker pour Mac Les montages de volume se comportent différemment du système docker de base. C'est principalement parce que Docker essaie de se conformer aux directives Sandbox du système de fichiers D'Apple.

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

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

De Partage de fichiers de préférences

/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 répertoriés dans le panneau de partage, mais /var ne l'est pas (même si les deux sont une partie de la /private)? Docker pour la documentation de Mac sur les espaces de noms de système de fichiers explique:

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

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

Remarque que /var/run est spécifiquement mentionné ici comme un endroit qui serait monté à partir de la machine virtuelle Linux, au lieu de macOS.

Lorsque vous demandez un montage de volume, les exportations du système de fichiers macOS sont d'abord vérifiées. S'il n'y a pas de correspondance, la machine virtuelle Linux où Docker est en cours d'exécution est cochée ensuite. Si aucun d'entre eux 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 /var/folders ne le fait pas. Par conséquent, le chemin n'est pas disponible, et le mont échouer.

Si vous changez le chemin à /private/var, alors il réussira, car macOS exporte l'arborescence entière du système de fichiers /private pour le montage.

Afin de rendre les choses plus portables, vous pouvez tester la plate-forme sur laquelle vous utilisez actuellement, et si c'est macOS, préfixez le chemin de montage avec /private.

43
répondu Dan Lowe 2017-07-15 21:56:38

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 varie 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 parce que pas assez d'autorisation, et cela ne fonctionne pas.

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

1
répondu djangofan 2018-04-18 16:10:54