tag - Cómo montar un directorio de host en un contenedor Docker




imagenes docker (13)

Estoy intentando montar un directorio de host en un contenedor de Docker para que las actualizaciones realizadas en el host se reflejen en los contenedores de Docker. No pude tener éxito después de googlear y leer los enlaces del volumen Docker.

¿Dónde estoy haciendo algo mal? Aquí esta lo que hice:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore $ docker run -d -v / Users / kishore / main_folder: / test_container k3_s3: más reciente c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

[email protected]:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root @ 0f17e2313a46: / test_container # exit salida

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • No sé cómo comprobar la versión boot2docker

Preguntas, problemas que enfrenta:

  1. ¿Cómo debo vincular main_folder a la carpeta test_container presente dentro del contenedor docker?
  2. Necesito hacer esto automáticamente. ¿Cómo puedo hacer eso sin usar realmente el comando run -d -v ?
  3. ¿Qué pasa si el boot2docker se bloquea? ¿Dónde se almacenan los archivos de Docker (aparte de Dockerfile)?

¿Es posible que use la boot2docker acoplable en OS X a través de boot2docker o algo similar?

He realizado la misma experiencia: el comando es correcto pero, de todos modos, no se monta nada (sensible) en el contenedor.

Resulta que ya está explicado en la documentación de la ventana acoplable . Cuando escribe docker run -v /var/logs/on/host:/var/logs/in/container ... entonces /var/logs/on/host realidad se asigna desde la boot2docker VM boot2docker , no desde su Mac.

Tendrá que canalizar la carpeta compartida a través de su VM a su host real (la Mac en mi caso).


2 montajes sucesivos: supongo que muchas publicaciones aquí podrían estar usando dos boot2docker, la razón por la que no ve nada es porque está montando un directorio desde boot2docker no desde su host. Básicamente necesitas 2 montajes sucesivos: el primero para montar un directorio desde tu host a tu sistema y el segundo para montar el nuevo directorio desde boot2docker a tu contenedor de esta manera:

1. montar el sistema local en boot2docker

sudo mount -t vboxsf hostfolder /boot2dockerfolder

2. monte el archivo boot2docker en un contenedor de linux

docker run -v /boot2dockerfolder:/root/containerfolder -i -t  imagename

luego, cuando esté dentro de la carpeta del contenedor, verá el contenido de la carpeta del host.


Actualización de julio de 2015: boot2docker ahora admite el montaje directo. Puede usar -v /var/logs/on/host:/var/logs/in/container directamente desde el indicador de su Mac, sin el doble montaje


Descubrí que cualquier directorio que se encuentre bajo la directiva del sistema como /var , /usr , /etc no se puede montar bajo el contenedor.

La directiva debe estar en el espacio del usuario; el conmutador le indica al demonio de la ventana acoplable que monte el directorio local en el contenedor, por ejemplo:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}

Hay un par de maneras en que puedes hacer esto. La forma más sencilla de hacerlo es utilizar el comando ADD del archivo docker así:

ADD . /path/inside/docker/container

Sin embargo, cualquier cambio realizado en este directorio en el host después de compilar el dockerfile no se mostrará en el contenedor. Esto se debe a que al crear un contenedor, la ventana acoplable comprime el directorio en un .tar y carga ese contexto en el contenedor de forma permanente.

La segunda forma de hacerlo es la forma en que lo intentaste, que es montar un volumen. Debido a que intenta ser lo más portátil posible, no puede asignar un directorio de host a un directorio de contenedor de ventana acoplable dentro de un archivo de docker, porque el directorio de host puede cambiar dependiendo de la máquina en la que esté ejecutando. Para asignar un directorio de host a un directorio contenedor de ventana acoplable, debe usar el indicador -v cuando se usa la ventana acoplable de la siguiente manera:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

He estado teniendo el mismo problema. Mi línea de comando se veía así:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

El problema fue con 'pwd'. Así que cambié eso a $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME

Solo estoy experimentando con hacer que mi aplicación SailsJS se ejecute dentro de un contenedor Docker para mantener mi máquina física limpia.

Estoy usando el siguiente comando para montar mi aplicación SailsJS / NodeJS en / app:

cd my_source_code_folder
docker run -it -p 1337:1337 -v $(pwd):/app my_docker/image_with_nodejs_etc

Tenía el mismo problema. Encontré esto en la documentación de la ventana acoplable :

Nota: El directorio de host es, por su naturaleza, dependiente del host. Por esta razón, no puede montar un directorio de host desde Dockerfile, la instrucción VOLUME no permite pasar un directorio de host, ya que las imágenes construidas deben ser portátiles. Un directorio de host no estaría disponible en todos los hosts potenciales.

Por lo tanto, montar un directorio de host de lectura / escritura solo es posible con el parámetro -v en el comando de docker run la docker run , ya que las otras respuestas señalan correctamente.


Tenga en cuenta que en Windows tendrá que proporcionar la ruta absoluta.

A continuación funcionó para mí.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash

Tuve los mismos problemas, estaba tratando de montar la carpeta C: \ Users \ en la ventana acoplable
Así es como lo hice en la línea de comandos de Docker Toolbox.

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>

¿Cómo vinculo main_folder a la carpeta test_container presente dentro del contenedor docker?

Su comando a continuación es correcto, a menos que esté en un mac usando boot2docker (dependiendo de las actualizaciones futuras), en cuyo caso puede encontrar la carpeta vacía. Ver mattes respuesta para un tutorial sobre cómo corregir esto.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Necesito hacer que esto se ejecute automáticamente, cómo hacerlo sin usar realmente el comando run -d -v.

Realmente no puedes dejar de usar estos comandos, son intrínsecos a la forma en que funciona la ventana acoplable. Es mejor que los coloques en un script de shell para que no tengas que escribirlos repetidamente.

¿Qué pasa si boot2docker se bloquea? ¿Dónde se almacenan los archivos docker?

Si logra usar -v arg y hace referencia a su máquina host, entonces los archivos estarán seguros en su host.

Si has usado 'docker build -t myimage'. con un Dockerfile, sus archivos se incluirán en la imagen.

Las imágenes de su docker, creo, están almacenadas en boot2docker-vm. Descubrí esto cuando mis imágenes desaparecieron cuando borro la VM de VirtualBox. (Tenga en cuenta que no sé cómo funciona Virtualbox, por lo que es posible que las imágenes aún se encuentren ocultas en otro lugar, pero que la ventana acoplable no las pueda ver).


[ACTUALIZACIÓN] A partir de junio de 2017, Docker para Mac se encarga de todas las partes molestas de esto, donde debes meterte con VirtualBox. Le permite mapear básicamente todo en su host local usando el prefijo /private . Más información here . [/ACTUALIZAR]

Todas las respuestas actuales hablan de Boot2docker. Dado que ahora está en desuso a favor de docker-machine, esto funciona para docker-machine:

Primero, ssh en el docker-machine vm y cree la carpeta que asignaremos a:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Ahora comparte la carpeta a VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Finalmente, ssh nuevamente en el docker-machine y monte la carpeta que acabamos de compartir:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Nota: para UID y GID, básicamente puedes usar los números enteros siempre que no estén tomados.

Esto se prueba a partir de docker-machine 0.4.1 y docker 1.8.3 en OS X El Capitan.


docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

En mi sistema, he corregido la respuesta de nhjk, funciona sin fallas cuando agregas la -t .







boot2docker