Estoy tratando de montar un directorio de host en un contenedor Docker para que cualquier actualización realizada en el host se refleje en los contenedores 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:latest
c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea
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 ..
root@0f17e2313a46:/test_container# exit exit
kishore$ docker -v
Docker version 0.9.1, build 867b2a9
- No sé cómo verificar la versión de boot2docker
Preguntas, problemas que enfrenta:
- ¿Cómo necesito vincular la carpeta principal a la carpeta test_container presente dentro del contenedor acoplable?
- Necesito hacer esto automáticamente. ¿Cómo hago eso sin usar realmente el
run -d -v
comando? - ¿Qué sucede si el boot2docker se bloquea? ¿Dónde se almacenan los archivos Docker (aparte de Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
fuente
fuente
Respuestas:
Hay un par de formas en que puedes hacer esto. La forma más sencilla de hacerlo es usar el
ADD
comando dockerfile de la siguiente manera:Sin embargo, los cambios realizados en este directorio en el host después de crear el dockerfile no se mostrarán en el contenedor. Esto se debe a que al construir un contenedor, la ventana acoplable comprime el directorio en
.tar
ay carga ese contexto en el contenedor de forma permanente.La segunda forma de hacerlo es la forma en que intentó, 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 docker dentro de un dockerfile, porque el directorio de host puede cambiar según la máquina en la que se esté ejecutando. Para asignar un directorio de host a un directorio de contenedor de Docker, debe usar el
-v
indicador cuando use Docker ejecutar de la siguiente manera:fuente
ADD
en realidad no está "montando", copia el archivo en el contenedor persistiéndolo en su interior.El usuario de esta pregunta estaba usando
Docker version 0.9.1, build 867b2a9
, le daré una respuesta para la versión acoplable> = 17.06.Lo que desea, mantener el directorio local sincronizado dentro del directorio contenedor, se logra montando el volumen con type
bind
. Esto enlazará los directorios de origen (su sistema) y de destino (en el contenedor docker). Es casi lo mismo que montar un directorio en Linux.Según la documentación de Docker , el comando apropiado para montar es ahora en
mount
lugar de-v
. Aquí está su documentación:--mount
: Consta de múltiples pares clave-valor, separados por comas. Cada par clave / valor toma la forma de una<key>=<value>
tupla. La--mount
sintaxis es más detallada que-v
o--volume
, pero el orden de las teclas no es significativo y el valor de la bandera es más fácil de entender.El
type
del monte, que puede serbind
,volume
otmpfs
. (Vamos a usar bind )La
source
del monte. Para los montajes de enlace, esta es la ruta al archivo o directorio en el host del demonio Docker. Se puede especificar comosource
osrc
.La
destination
toma como valor de la ruta en el archivo o directorio se montarán en el contenedor. Puede ser especificado comodestination
,dst
otarget
.Entonces, para montar el directorio actual (fuente) con
/test_container
(destino) vamos a usar:Si estos parámetros de montaje tienen espacios, debe poner comillas alrededor de ellos. Cuando sé que no lo hacen, usaría en su
`pwd`
lugar:También tendrá que lidiar con el permiso de archivo, consulte este artículo .
fuente
2 montajes sucesivos: supongo que muchas publicaciones aquí podrían estar usando dos boot2docker, la razón por la que no ves nada es porque estás montando un directorio desde boot2docker, no desde tu host.
Básicamente necesitas 2 monturas sucesivas:
1) Montar el sistema local en
boot2docker
2) Montar el
boot2docker
archivo en el contenedor de LinuxLuego, cuando estés
ls
dentrocontainerfolder
, verás el contenido de tuhostfolder
.fuente
net share
comando dentro de un terminal de Windows (cmd). Y debe agregarlo como una carpeta compartida con la GUI virtualBox (usando el mismo nombre si sigue mi lógica). Si omite compartirlo, funcionará, pero enfrentará problemas con los permisos y las actuaciones de actualización.mount: unknown filesystem type 'vboxsf'
usando un invitado y host de ubuntupuede usar la opción -v desde 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, Docker lo creará.
Si realiza algún cambio en host_dir desde la máquina host (con privilegio de root), será visible para el contenedor y viceversa.
fuente
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
donde el host/tmp
se montará en el contenedor/tmp
. Ahora uno puedetouch /tmp/hello-world
desde el contenedor y ver el archivo aparecer en el host.¿Es posible que use Docker en OS X a través de
boot2docker
o algo similar?He hecho la misma experiencia: el comando es correcto pero, de todos modos, no hay nada (sensible) montado en el contenedor.
Como resultado, ya se explica en la documentación de la ventana acoplable . Cuando escribe
docker run -v /var/logs/on/host:/var/logs/in/container ...
, en/var/logs/on/host
realidad se asigna desde laboot2docker
imagen de VM, 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).
fuente
[ACTUALIZACIÓN] A partir de ~ junio de 2017, Docker para Mac se encarga de todas las partes molestas de esto en las que tienes que meterte con VirtualBox. Le permite mapear básicamente todo en su host local usando el
/private
prefijo. Más información aquí . [/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 crea la carpeta que asignaremos a:
Ahora comparta la carpeta a VirtualBox:
Finalmente, ssh nuevamente en la máquina acoplable y monte la carpeta que acabamos de compartir:
Nota: para UID y GID, básicamente puede usar los enteros, siempre que no estén tomados.
Esto se ha probado a partir de docker-machine 0.4.1 y docker 1.8.3 en OS X El Capitan.
fuente
docker-machine
documento.-v
bandera?-v
bandera no funciona como cabría esperar en OS X (o Windows). Docker se ejecuta en una VM, por lo que la carpeta a la que se hace referencia-v
apunta a una carpeta en la VM, no en el sistema operativo raíz. Esta técnica da el siguiente paso para asignar la carpeta VM de nuevo al sistema operativo raíz./Users
para compartir en la ventana acoplable. Eso significa que si sus archivos de trabajo están dentro,~/*
entonces está listo para comenzar. Si tiene que agotar su entorno de desarrollo/development
o cualquier otra cosa que/Users
no sea, tendrá problemas docs.docker.com/engine/userguide/containers/dockervolumesSolo estoy experimentando con la ejecución de mi aplicación SailsJS dentro de un contenedor Docker para mantener limpia mi máquina física.
Estoy usando el siguiente comando para montar mi aplicación SailsJS / NodeJS en / app:
fuente
En mi sistema, he corregido la respuesta de nhjk, funciona perfectamente cuando agrega la
-t
bandera.fuente
Si el host es Windows 10, en lugar de barra diagonal, utilice la barra diagonal inversa -
Asegúrese de que la unidad host sea compartida (C en este caso). En mi caso, recibí un mensaje solicitando permiso para compartir después de ejecutar el comando anterior.
fuente
En Mac OS, para montar una carpeta
/Users/<name>/projects/
en su Mac en la raíz de su contenedor:docker run -it -v /Users/<name>/projects/:/projects <container_name> bash
ls /projects
fuente
Actualización de julio de 2015: boot2docker ahora admite el montaje directo. Puede usarlo
-v /var/logs/on/host:/var/logs/in/container
directamente desde el indicador de Mac, sin doble montajefuente
Para los usuarios de Windows 10 , es importante tener el punto de montaje dentro del
C:/Users/
directorio. Intenté durante horas hacer que esto funcionara. Esta publicación ayudó pero no fue obvia al principio ya que la solución para Windows 10 es un comentario a una respuesta aceptada. Así es como lo hice:Luego, para probarlo, puedes hacerlo
echo TEST > hostTest.txt
dentro de tu imagen. Debería poder ver este nuevo archivo en la carpeta del host local enC:/Users/C/Desktop/dockerStorage/
.fuente
-v $(pwd):/var/xx
primero y funcionó, pero resultó en un directorio vacío. Estoy ejecutando cyg a través de babun.He estado teniendo el mismo problema. Mi línea de comando se veía así:
El problema fue con 'pwd'. Entonces cambié eso a $ (pwd):
fuente
z
?A partir de Docker 18-CE, puede usar
docker run -v /src/path:/container/path
para hacer un 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 de 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 lo intenta
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 ENTONCES lo hace
docker run -v ${PWD}:/projectpath
y lo encontrará en el contenedor, / projectpath reflejará / c / projectpath en tiempo real. No hay errores ni ninguna otra forma de detectar este problema que no sea ver monturas vacías dentro de su invitado.También debe asegurarse de "compartir la unidad" en la configuración de Docker para Windows.
fuente
/c/projectpath
pero luego aparece el errorbind mount source path does not exist: /host_mnt/c/projectpath
.He descubierto que cualquier directorio que pone bajo la directiva del sistema como
/var
,/usr
,/etc
no se podría montar en el marco del contenedor.La directiva debe estar en el
-v
interruptor de espacio del usuario, indica a Docker Daemon que monte el directorio local en el contenedor, por ejemplo:fuente
boot2docker junto con VirtualBox Guest Additions
Cómo montar / Usuarios en boot2docker
https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c
fuente
¿Cómo vinculo main_folder a la carpeta test_container presente dentro del contenedor docker?
El siguiente comando es correcto, a menos que esté en una Mac usando boot2docker (dependiendo de futuras actualizaciones) en cuyo caso puede encontrar la carpeta vacía. Vea la respuesta mate para un tutorial sobre cómo corregir esto.
Necesito hacer que esto se ejecute automáticamente, cómo hacerlo sin usar realmente el comando run -d -v.
Realmente no puede escapar del uso de estos comandos, son intrínsecos a la forma en que funciona Docker. Sería mejor ponerlos en un script de shell para evitar que los escriba repetidamente.
¿Qué sucede si boot2docker se bloquea? ¿Dónde se almacenan los archivos acoplables?
Si logra utilizar el argumento -v y hacer referencia a su máquina host, los archivos estarán seguros en su host.
Si ha usado 'docker build -t myimage'. con un Dockerfile, sus archivos se incluirán en la imagen.
Sus imágenes de Docker, creo, se almacenan en boot2docker-vm. Descubrí esto cuando mis imágenes desaparecieron cuando eliminé el vm de VirtualBox. (Tenga en cuenta que no sé cómo funciona Virtualbox, por lo que las imágenes aún pueden estar ocultas en otro lugar, simplemente no visibles para la ventana acoplable).
fuente
Tuve el mismo problema Encontré esto en la documentación de la ventana acoplable :
Por lo tanto, montar un directorio de host de lectura / escritura solo es posible con el
-v
parámetro en eldocker run
comando, ya que las otras respuestas señalan correctamente.fuente
Aquí hay un ejemplo con una ruta de Windows:
Como nota al margen, durante todo este tirón del cabello, teniendo que luchar para resolver y volver a escribir los caminos una y otra vez, decidí crear un pequeño
AutoHotkey
script para convertir un camino de Windows en un camino con formato "Docker Windows " . De esta forma, todo lo que tengo que hacer es copiar cualquier ruta de Windows que quiera usar como punto de montaje en el portapapeles, presionar la "Tecla de aplicaciones" en el teclado, y la formateará en un formato de ruta que Docker aprecia.Por ejemplo:
Copia esto en tu portapapeles:
C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr
presione
Apps Key
mientras el cursor está donde lo desea en la línea de comandos, y lo pegará allí:"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"
Me ahorra mucho tiempo. Aquí está para cualquier otra persona que pueda encontrarlo útil.
fuente
Para que esto funcione en Windows 10 , tuve que abrir la ventana de configuración de Docker desde la bandeja del sistema e ir a sección Unidades compartidas .
Luego marqué la casilla junto a
C
. Docker solicitó mis credenciales de escritorio para obtener autorización para escribir en mi carpeta Usuarios.Luego ejecuté el contenedor docker siguiendo los ejemplos anteriores y también el ejemplo en esa página de configuración, adjuntándolo al
/data
contenedor.fuente
Tenga en cuenta que en Windows tendrá que proporcionar la ruta absoluta.
A continuación funcionó para mí.
fuente
tuve los mismos problemas, estaba tratando de montar la carpeta C: \ Users \ en la ventana acoplable
así es como lo hice Línea de comando de Docker Toolbox
fuente
Tenía el mismo requisito para montar el directorio de host desde el contenedor y utilicé el comando de montaje de volumen. Pero durante las pruebas, noté que también está creando archivos dentro del contenedor, pero después de algunas excavaciones descubrió que solo son enlaces simbólicos y el sistema de archivos real utilizado desde la máquina host.
fuente
También puede hacer esto con la aplicación web Portainer para una experiencia visual diferente.
Primero tire de la imagen Portainer:
Luego cree un volumen para Portainer:
También cree un contenedor Portainer:
Podrá acceder a la aplicación web con su navegador en esta URL: " http: // localhost: 9000 ". En el primer inicio de sesión, se le pedirá que configure sus credenciales de administrador de Portainer.
En la aplicación web, siga estos menús y botones: (Contenedor> Agregar contenedor> Configuración de relleno > Implementar contenedor)
Tuve problemas para crear un volumen de "montaje" con Portainer y me di cuenta de que tenía que hacer clic en "vincular" al crear el volumen de mi contenedor. A continuación se muestra una ilustración de la configuración de enlace de volumen que funcionó para la creación de mi contenedor con un volumen montado enlazado al host.
PD: estoy usando Docker 19.035 y Portainer 1.23.1
fuente