Volumen de archivo único montado como directorio en Docker


La documentación de Docker dice que es posible montar un solo archivo en un contenedor de Docker:

La bandera-v también se puede usar para montar un solo archivo - en lugar de solo directorios - desde la máquina host.

$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

Esto lo llevará a un shell de bash en un nuevo contenedor, tendrá su historial de bash desde el host y cuando salga del contenedor, el host tendrá el historial de los comandos contenedor.

Cuando intento que sin embargo el archivo se monta como un directorio:

tom@u ~/project $ docker run --rm -it -v file.json:/file.json test
total 80K
drwxr-xr-x  9 root root 4.0K Dec  7 12:58 .
drwxr-xr-x 63 root root 4.0K Dec  7 12:58 ..
drwxr-xr-x  2 root root 4.0K Dec  4 16:10 file.json

Mi Dockerfile se ve así:

FROM ubuntu:14.04
MAINTAINER Tom
CMD ["ls", "-lah", "/test"]

La versión de Docker es 1.9.1, compilación a34a1d5.

¿Es esto un problema de documentación, un malentendido por mi parte, o está pasando algo más?

Author: TTT, 2015-12-07

4 answers

test es el nombre de tu imagen que has construido con 'docker build -t test', no una carpeta /test.

Prueba un Dockerfile con:

CMD ["ls", "-lah", "/"]
or
CMD ["cat", "/file.json"]

Y:

docker run --rm -it -v $(pwd)/file.json:/file.json test

Tenga en cuenta el uso de $(pwd) para montar un archivo con su ruta absoluta completa (no se admiten rutas relativas)

 28
Author: VonC,
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
2015-12-07 15:54:43

Pasé un poco luchando y diagnosticando este problema ejecutando docker en Windows. Esto también podría afectar a las personas que se ejecutan en Mac OSX, por lo que agrego una respuesta aquí para las personas que posiblemente tengan un problema en esos entornos, ya que mi búsqueda me llevó a este lugar y para agregar una explicación de lo que parece estar sucediendo en docker.

En Windows o Mac OSX, su docker se está ejecutando realmente en una máquina virtual boot2docker y solo el directorio de usuarios se comparte de forma predeterminada. En Windows, este usuario el directorio se comparte como/ c /Users/, sin embargo, en el shell de MinGW incluido con Docker Machine, se puede acceder a la unidad como / C o / c, por lo que esto puede volverle loco si olvida que los comandos de docker se ejecutan realmente contra la VM boot2docker y las rutas de archivo deben existir en la VM boot2docker y especificarse de la manera en que existen allí porque lo que parece estar ocurriendo en docker es que en lugar de dar una advertencia o un error de que el directorio/archivo no existe, docker silenciosamente crea el origen especificado como un directorio en la máquina virtual boot2docker, por lo que no hay salida lista para indicar que está haciendo algo incorrectamente.

Así que, como en la respuesta anterior, si su archivo se está montando como un directorio, compruebe que está proporcionando una ruta absoluta. Para Windows y Mac OSX compruebe que la ruta absoluta que está montando existe en su máquina virtual boot2docker.

 17
Author: JDL,
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
2016-05-20 16:36:03

Tal vez eso está claro en las respuestas anteriores... pero me llevó algún tiempo averiguarlo en mi caso.

La razón subyacente que causa que el archivo que se comparte con-v aparezca como un directorio en lugar de un archivo es que Docker no pudo encontrar el archivo en el host. Así que Docker crea un nuevo directorio en el contenedor con el nombre siendo el nombre del archivo no existente en el host, ya que docker piensa que el usuario solo desea compartir un directorio volume/que se creará en el futuro.

Así que en el problema reportado anteriormente, si usó un directorio relativo en el comando-v y docker no entiende los directorios relativos, eso significa que el archivo no se encontró en el host y, por lo tanto, docker creó un directorio. Y la respuesta anterior que sugiere usar pw (pwd) será la solución correcta cuando el problema se deba a un directorio relativo.

Pero para aquellos que leen esta página que no están usando un directorio relativo y están teniendo el mismo problema... entonces inténtalo. para entender por qué falta el archivo en el host.

Podría ser un error estúpido...

Podría ser que está ejecutando el comando "docker run" desde un cliente que genera el contenedor docker en un host diferente y el archivo que se comparte no existe en ese host diferente. El archivo que se comparte con-v debe existir en el host donde el agente de docker generará el contenedor... no necesariamente en el cliente donde el " docker run-v ..."comando se ejecuta (aunque ellos será lo mismo en muchos casos).

Hay otras posibles explicaciones anteriores para Mac y Windows... eso podría ser también.

Así que el archivo que falta en el host es el problema... solucione el problema en su configuración... usando $(pwd) podría ser la solución, pero no siempre.

 16
Author: Nikopol,
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-06 13:34:17

Hay una solución simple para aquellos que usan la máquina VirtualBox. Por defecto, el C:/User se añade la carpeta. Si su proyecto está en C:/projects, agregue esta carpeta para que esté disponible en VB (con montaje automático).

 0
Author: starski,
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-10-07 01:57:43