Montajes denegados. Las rutas not no se comparten desde OS X y Docker no las conoce


El comando docker run-v /var/folders/zz/... produce el siguiente error.

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.

Cuando abro el Intercambio de archivos, veo que /private ya está en la lista.

Si intento agregar /var/folder/, se resuelve en /private/var/folders, que es un subconjunto de /private y por lo tanto la adición es rechazada.

Para resumir, me parece como el directorio /var/folders/.. es compartido por OS X como un subdirectorio de / private y por lo tanto debe ser conocido por Docker. Cualquier ayuda en se agradecería que se resolviera esta cuestión.

Como experimento, reemplacé el /private en el Intercambio de archivos con las carpetas /private/var/y reinicié la ventana acoplable, pero el resultado no cambió.

Solo para una referencia más completa, este es el script .sh, que ejecuta este script python, que a su vez ejecuta el comando docker.

Author: mohan08p, 2017-07-15

2 answers

Docker para Mac Los montajes de volumen se comportan de manera diferente que el sistema Docker base. Esto se debe principalmente a que Docker intenta cumplir con las directrices del sandbox del sistema de archivos de Apple.

Como se muestra en las preferencias de Docker, macOS solo exporta ciertas rutas.

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

Panel de preferencias de uso compartido de archivos

/var en macOS es un enlace simbólico a /private. Eso también es cierto para /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

¿Por qué /tmp aparece en el panel compartir, pero /var no lo está (aunque ambos sean parte de /private)? La documentación de Docker para Mac sobre los espacios de nombres del sistema de archivos explica:

De forma predeterminada, puede compartir archivos en /Users/, /Volumes/, /private/, y /tmp directamente. Para agregar o eliminar árboles de directorios que se exportan a Docker, utilice la ficha Uso compartido de archivos en Preferencias de Docker whale menú - > Preferencias - > Intercambio de archivos. (Consulte Preferencias.)

Todas las demás rutas utilizadas en -v los montajes de enlace se obtienen de la máquina virtual Moby Linux que ejecuta los contenedores Docker, por lo que argumentos como -v /var/run/docker.sock:/var/run/docker.sock deberían funcionar como se esperaba. Si una ruta de acceso de macOS no se comparte y no existe en la máquina virtual, fallará un intento de enlazarla en lugar de crearla en la máquina virtual. Las rutas que ya existen en la máquina virtual y contienen archivos son reservadas por Docker y no se pueden exportar desde macOS.

Tenga en cuenta que /var/run se menciona específicamente aquí como un lugar que se montaría desde la máquina virtual Linux, en lugar de desde macOS.

Cuando solicita un montaje de volumen, las exportaciones del sistema de archivos de macOS se comprueban primero. Si no hay coincidencia allí, la máquina virtual Linux donde se está ejecutando Docker se comprueba a continuación. Si ninguno de ellos tiene el camino que solicitó, entonces el montaje falla.

En su caso, macOS no exporta /var. /var existe en la máquina virtual Linux, pero /var/folders no. Por lo tanto, el camino no está disponible, y el montaje fallar.

Si cambia la ruta a /private/var, entonces tendrá éxito, porque macOS exporta todo el árbol del sistema de archivos /private para montarlo.

Para hacer las cosas más portátiles, es posible que desee probar en qué plataforma se está ejecutando actualmente, y si es macOS, prefije la ruta de montaje con /private.

 43
Author: Dan Lowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-15 21:56:38

Como ejemplo, usando Portainer, este comando funciona para mí:

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

Pero, si varío el -v /var:/data en absoluto, no funcionará. Creo (pero no estoy seguro) que es porque Docker está tratando de hacer un mkdir. Por lo tanto, si intento montar -v /var/whatever:/data, mkdir falla porque no tiene suficiente permiso, y no funciona.

Tengo 2 Mac (High Sierra) y lo probé en ambos. El mismo problema. Además, traté de usar Docker Beta channel. Creo que entiendo la respuesta de Dan Lowe: Actualizaré esta respuesta si funciona para mí.

 1
Author: djangofan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 16:10:54