run - dockers container download
Cómo montar un directorio de host en un contenedor Docker (19)
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"]
1 directory, 5 files
kishore$ pwd
/Users/kishore/tdock
kishore$ tree
.
├── Dockerfile
└── main_folder
├── tfile1.txt
├── tfile2.txt
├── tfile3.txt
└── tfile4.txt
kishore $ docker run -d -v / Users / kishore / main_folder: / test_container k3_s3: más reciente
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
c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea
root @ 0f17e2313a46: / test_container # exit
salida kishore$ docker run -i -t k3_s3:latest /bin/bash
root@0f17e2313a46:/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 ..
kishore$ docker -v
Docker version 0.9.1, build 867b2a9
- No sé cómo comprobar la versión boot2docker
Preguntas, problemas que enfrenta:
- ¿Cómo debo vincular main_folder a la carpeta test_container presente dentro del contenedor docker?
- Necesito hacer esto automáticamente. ¿Cómo puedo hacer eso sin usar realmente el comando
run -d -v
? - ¿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.
A partir de Docker 18-CE, puede usar la docker run -v /src/path:/container/path
para realizar el enlace bidireccional de una carpeta de host.
Sin embargo, hay un problema importante aquí si está trabajando con Windows 10 / WSL y tiene Docker-CE para Windows como su host y luego las herramientas de cliente docker-ce en WSL. WSL conoce todo el sistema de archivos, mientras que su host de Windows solo conoce sus unidades. Dentro de WSL, puede usar / mnt / c / projectpath, pero si intenta conectar dock docker run -v ${PWD}:/projectpath
, encontrará en el host que / projectpath / está vacío porque en el host / mnt no significa nada .
Sin embargo, si trabaja desde / c / projectpath y THEN docker run -v ${PWD}:/projectpath
ventana docker run -v ${PWD}:/projectpath
y encontrará que en el contenedor, / projectpath reflejará / c / projectpath en tiempo real. No hay errores ni ninguna otra forma de detectar este problema más que ver montajes vacíos dentro de su invitado.
También debe asegurarse de "compartir la unidad" en la configuración de Docker para Windows.
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}
El usuario de esta pregunta estaba usando Docker version 0.9.1, build 867b2a9
, le daré una respuesta para la versión de docker> = 17.06.
Lo que desea, mantener el directorio local sincronizado dentro del directorio contenedor, se logra al montar el volumen con el tipo de bind
. Esto vinculará los directorios de origen (su sistema) y de destino (en el contenedor de la ventana acoplable). Es casi lo mismo que montar un directorio en Linux.
De acuerdo con la documentación de Docker , el comando apropiado para montar ahora es mount
lugar de -v
. Aquí está su documentación:
--mount
: consta de varios pares clave-valor, separados por comas. Cada par clave / valor toma la forma de una tupla<key>=<value>
. La sintaxis--mount
es más detallada que-v
o--volume
, pero el orden de las claves no es significativo, y el valor de la bandera es más fácil de entender.El
type
de montaje, que puede serbind
,volume
otmpfs
. (Vamos a utilizar enlace )La
source
de la montura. Para los montajes de enlace, esta es la ruta al archivo o directorio en el host daemon de Docker. Puede especificarse comosource
osrc
.El
destination
toma como valor la ruta donde se montará el archivo o directorio en el contenedor. Puede especificarse comodestination
,dst
otarget
.
Entonces, para montar el directorio actual (fuente) con /test_container
(target) vamos a usar:
docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3
Si estos parámetros de montaje tienen espacios, debe poner comillas alrededor de ellos. Cuando sé que no lo hacen, usaría `pwd`
en `pwd`
lugar:
docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3
También tendrás que lidiar con el permiso de archivo, consulta este artículo .
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
Para los usuarios de Windows 10 , es importante tener el punto de montaje dentro del directorio C:/Users/
. Intenté durante horas para que esto funcione. Esta publicación ayudó, pero al principio no fue evidente, ya que la solución para Windows 10 es un comentario a una respuesta aceptada. Así es como lo hice:
docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches /
<your-image-here> /bin/bash
Luego, para probarlo, puede hacer echo TEST > hostTest.txt
dentro de su imagen. Debería poder ver este nuevo archivo en la carpeta del host local en C:/Users/C/Desktop/dockerStorage/
.
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.
Tenía el mismo requisito para montar el directorio de host desde el contenedor y usé el comando de montaje de volumen. Pero durante las pruebas, se dio cuenta de que también está creando archivos dentro del contenedor, pero después de algunas excavaciones descubrió que solo son enlaces simbólicos y que el sistema de archivos real utiliza la máquina host.
Tenga en cuenta que en Windows tendrá que proporcionar la ruta absoluta.
- Anfitrión: Windows 10
- Contenedor: Cuaderno Tensorflow
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>
puede usar la opción -v de cli, esta función no está disponible a través de Dockerfile
docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash
donde host_dir es el directorio del host que desea montar. no necesita preocuparse por el directorio del contenedor si no existe, la ventana acoplable lo creará.
Si realiza cambios en host_dir desde la máquina host (bajo privilegio de root), será visible para el contenedor y viceversa.
¿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.
boot2docker junto con VirtualBox Guest Additions
Cómo montar / Usuarios en boot2docker
tl; dr Cree su propio boot2docker.iso personalizado con VirtualBox Guest Additions (vea el link ) o descargue http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso y guárdelo a ~ / .boot2docker / boot2docker.iso.
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
.