volumenes run remote compose linux docker dockerfile

linux - run - Volumen de archivo único montado como directorio en Docker



dockerfile volume (4)

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

El indicador -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 colocará en un shell 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 escritos mientras se encuentra en el contenedor.

Cuando intento eso, 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 este un problema de documentación, un malentendido por mi parte o hay algo más en juego?


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


Pasé un poco luchando y diagnosticando este problema ejecutando la ventana acoplable en Windows. Esto también podría afectar a las personas que se ejecutan en Mac OSX, así 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 la ventana acoplable.

En Windows o Mac OSX, su ventana acoplable se ejecuta realmente en una máquina virtual boot2docker y solo el directorio de usuarios se comparte de manera predeterminada. En Windows, este directorio de usuario se comparte como / c / Users /, sin embargo, en el shell de MinGW que se incluye con Docker Machine, se puede acceder a la unidad como / C o / c, por lo que esto puede volverte loco si olvidas que los comandos de la ventana acoplable están realmente ejecutándose contra la VM boot2docker y sus rutas de archivo tienen que existir en la VM boot2docker y deben especificarse de la manera que existen allí porque lo que parece estar ocurriendo en la ventana acoplable es que en lugar de dar una advertencia o error de que el directorio / archivo sí no existe, la ventana acoplable crea silenciosamente la fuente especificada como un directorio en la máquina virtual boot2docker, por lo que no hay una salida lista para indicar que está haciendo algo incorrectamente.

Entonces, como en la respuesta anterior, si su archivo se está montando como un directorio, entonces verifique 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.


Tal vez eso quede claro en las respuestas anteriores ... pero me tomó algo de tiempo resolverlo en mi caso.

La razón subyacente que hace 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 como el nombre del archivo no existente en el host, ya que Docker cree que el usuario solo quiere compartir un volumen / directorio que se creará en el futuro.

Por lo tanto, en el problema informado anteriormente, si usó un directorio relativo en el comando -v y la ventana acoplable no comprende los directorios relativos, eso significa que el archivo no se encontró en el host y, por lo tanto, la ventana acoplable creó un directorio. Y la respuesta anterior que sugiere usar $ (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 tienen el mismo problema ... luego intente entender por qué falta el archivo en el host.

Podría ser un error tipográfico estúpido ...

Podría ser que esté ejecutando el comando "docker run" desde un cliente que genera el contenedor de la ventana acoplable 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 la ventana acoplable generará el contenedor ... no necesariamente en el cliente donde se ejecuta el comando "docker run -v ..." (aunque serán los mismos en muchos casos).

Hay otras explicaciones posibles más arriba para Mac y Windows ... que podrían serlo también.

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


test es el nombre de su imagen que ha creado con '' docker build -t test '', no una carpeta /test .

Pruebe 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 (las rutas relativas no son compatibles)