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

618

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:

  1. ¿Cómo necesito vincular la carpeta principal a la carpeta test_container presente dentro del contenedor acoplable?
  2. Necesito hacer esto automáticamente. ¿Cómo hago eso sin usar realmente el run -d -vcomando?
  3. ¿Qué sucede si el boot2docker se bloquea? ¿Dónde se almacenan los archivos Docker (aparte de Dockerfile)?
Kishore Vaishnav
fuente
2
Para su información, esto parece haberse solucionado en la ventana acoplable a partir de este comentario. Estoy usando boot2docker en mi mac. Puedo usar la opción -v y mi directorio local se monta completamente en el contenedor.
Marco

Respuestas:

509

Hay un par de formas en que puedes hacer esto. La forma más sencilla de hacerlo es usar el ADDcomando dockerfile de la siguiente manera:

ADD . /path/inside/docker/container

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 .taray 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 -vindicador cuando use Docker ejecutar de la siguiente manera:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
fuente
Intenté así kishore $ docker -v / Users / kishore / main_folder: / test_container Docker versión 0.9.1, compilación 867b2a9 kishore $ docker run -v / Users / kishore / main_folder: / test_container Uso: docker run [OPCIONES] IMAGEN [ COMANDO] [ARG ...] Ejecute un comando en un nuevo contenedor -P, --publish-all = false: Publique todos los puertos expuestos en las interfaces del host -a, --attach = []: Adjunte a stdin, stdout o stderr. -c, --cpu-shares = 0: recursos compartidos de la CPU (peso relativo)
Kishore Vaishnav
2
puedes tener ambos AGREGAR. y -v volumen de montaje al mismo tiempo. usando app_dir predeterminado si no especifica un montaje de host?
alexzg
@alexzg No creo que solo tengamos prioridad para el primero. Además, no estoy claro acerca de su segundo punto por defecto app_dir ... host mount ..?
Kishore Vaishnav
35
Esto funcionó para mí en mac os x con docker-machine y VirtualBox. Una advertencia que descubrí por prueba y error es que el directorio del host debe ser una ruta completa y no una ruta relativa.
jbustamovej
25
ADDen realidad no está "montando", copia el archivo en el contenedor persistiéndolo en su interior.
kev
200

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 mountlugar 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 --mountsintaxis es más detallada que -vo --volume, pero el orden de las teclas no es significativo y el valor de la bandera es más fácil de entender.

  • El typedel monte, que puede ser bind, volumeo tmpfs. (Vamos a usar bind )

  • La sourcedel monte. Para los montajes de enlace, esta es la ruta al archivo o directorio en el host del demonio Docker. Se puede especificar como sourceo src.

  • La destinationtoma como valor de la ruta en el archivo o directorio se montarán en el contenedor. Puede ser especificado como destination, dsto target.

Entonces, para montar el directorio actual (fuente) con /test_container(destino) 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 en su `pwd`lugar:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

También tendrá que lidiar con el permiso de archivo, consulte este artículo .

Eduardo Santana
fuente
2
He votado su respuesta porque me encanta lo concisa que es y no está mal, pero es posible que desee actualizarla un poco a la luz de mi respuesta en stackoverflow.com/a/51829247/901899
rainabba
2
Supongo que la documentación se ha actualizado desde esta respuesta, ya que en este momento parece recomendar volúmenes, en lugar de montajes. Vale la pena hacerlo, antes de comprometerse a nada.
Sipty
1
@Sipty puede estar refiriéndose a lo siguiente: " Si está desarrollando nuevas aplicaciones Docker, considere usar volúmenes con nombre en su lugar. No puede usar los comandos de Docker CLI para administrar directamente los montajes de enlace " .
Aluthren
81

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:

el primero en montar un directorio desde su host a su sistema

el segundo para montar el nuevo directorio desde boot2docker a su contenedor de esta manera:

  • 1) Montar el sistema local en boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Montar el boot2dockerarchivo en el contenedor de Linux

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

Luego, cuando estés lsdentro containerfolder, verás el contenido de tu hostfolder.

louis V
fuente
1
La mejor respuesta. Tengo que agregar que (bajo Windows) la carpeta host en el comando mount se refiere a un nombre de carpeta compartida. El que aparece con un net sharecomando 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.
Kir Kanos
¿Cómo sabe el comando mount el host donde está / boot2dockerfolder?
alfonsodev
Recibí el error:, mount: unknown filesystem type 'vboxsf'usando un invitado y host de ubuntu
nnyby
"vboxsf" es el controlador del "sistema de archivos" de carpetas compartidas de VirtualBox. Debe configurarse en la VM instalando las extensiones de VirtualBox. La imagen boot2docker no debe tener estos instalados. VirtualBox tiene una función de "dispositivo" para "insertar" las imágenes ISO de VirtualBox Additions como un volumen virtual. Por lo general, puede montar esto en el montaje utilizando mount / dev / cdrom / mnt, entrando en / mnt y ejecutando bash VBoxLinuxAdditions. Puede necesitar la instalación de gcc, kernel u otras dependencias.
Andrew Wolfe
mount.vboxsf: error de montaje con el error: No existe tal archivo o directorio montaje: montaje mymapfoldername en / boot2dockerfolder fallido: No existe tal archivo o directorio
vee
71

puede 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.

rgaut
fuente
66
Qué ejemplo agradable, limpio y preciso para ilustrar la opción de montaje del host. Tal vez podría mejorarse utilizando un directorio real: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashdonde el host /tmpse montará en el contenedor /tmp. Ahora uno puede touch /tmp/hello-worlddesde el contenedor y ver el archivo aparecer en el host.
Stephan Henningsen
3
Funciona perfecto Pero montar de esta manera establece al propietario del directorio como root y esto también espera que el contenedor se ejecute como root. ¿Cómo montamos el directorio como no root cuando el contenedor se ejecuta como no root?
Arun
33

¿Es posible que use Docker en OS X a través de boot2dockero 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/hostrealidad se asigna desde la boot2dockerimagen 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).

usuario3680997
fuente
1
¡Gracias! Esto me ayudó con un problema lejano relacionado. Postgres que se ejecuta dentro de Docker se había vinculado a la IP de VBox, no al host local, como lo habría hecho si no se ejecutara en OS X.
Peter Becich
2
Esa URL a la documentación ventana acoplable ya no es válida
digitaldavenyc
jaja el mejor chiste de todos ... realmente podrían haber dado una pista más o menos.
user2834172
2
Su enlace de documentación es un 404
Factor Mystic
3
Tengo curiosidad por ver un ejemplo de canalizar la carpeta compartida a través de la VM al host real.
Derek
28

[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 /privateprefijo. 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:

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

Ahora comparta la carpeta a VirtualBox:

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

Finalmente, ssh nuevamente en la máquina acoplable 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 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.

Eli
fuente
1
+1. Después de varias horas de golpearme la cabeza, su respuesta funcionó. Esto debería ser parte del docker-machinedocumento.
Abhijit Sarkar
¿Por qué no usar la -vbandera?
igracia
1
@igracia, la -vbandera 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 -vapunta 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.
Patrick Gunderson
1
@PatrickGunderson En mi caso (OS X) la carpeta está en el host, no en la VM, y funciona bien. Docker Tolls se encarga de exportarlo a la VM, y desde allí al contenedor.
igracia
1
La única excepción a la regla que mencioné es que la VM se montará automáticamente /Userspara 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 /developmento cualquier otra cosa que /Usersno sea, tendrá problemas docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

Solo 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:

cd my_source_code_folder
docker run -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc
Sven
fuente
55
¿Cómo puede hacer esto en el Dockerfile?
orad
23
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 perfectamente cuando agrega la -tbandera.

Ali
fuente
¿Eres capaz de crear / actualizar archivos del FS local y ver los cambios dentro del contenedor acoplable?
Avi Mehenwal
14

Si el host es Windows 10, en lugar de barra diagonal, utilice la barra diagonal inversa -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

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.

Duke79
fuente
13

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

bormat
fuente
11

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

Tal
fuente
11

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:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Luego, para probarlo, puedes hacerlo echo TEST > hostTest.txtdentro de tu imagen. Debería poder ver este nuevo archivo en la carpeta del host local en C:/Users/C/Desktop/dockerStorage/.

KF
fuente
Las dobles barras en el camino son lo que lo hizo funcionar para mí. Fue confuso porque lo usé -v $(pwd):/var/xxprimero y funcionó, pero resultó en un directorio vacío. Estoy ejecutando cyg a través de babun.
kenchilada
Tuve el mismo problema en Windows 7 al usar / c / data /, al mover el directorio del host a / c / Users / <user> / lo resolvió por mí. Gracias.
user8675309
1
¿Podemos tener un enlace a la publicación que lo ayudó a resolver el problema?
PBo
11

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'. Entonces cambié eso a $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
fuente
1
¿Para qué sirve z?
hhh
2
La opción z indica que el contenido de montaje de enlace se comparte entre varios contenedores.
Jason
10

A partir de Docker 18-CE, puede usar docker run -v /src/path:/container/pathpara 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}:/projectpathy 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.

rainabba
fuente
Tengo este problema con Win10 / WSL y Docker-CE / docker-ce. Vacío / projectpath /. ¿Qué quieres decir con "trabajar desde / c / projectpath"? Intenté vincular / c / a / mnt / c y ejecuté desde /c/projectpathpero luego aparece el error bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Este enlace resolvió mi problema: support.divio.com/local-development/docker/… (Docker en Windows solo permite el montaje desde / Users / por defecto)
Steven T. Snyder
7

He descubierto que cualquier directorio que pone bajo la directiva del sistema como /var, /usr, /etcno se podría montar en el marco del contenedor.

La directiva debe estar en el -vinterruptor de espacio del usuario, indica a Docker Daemon que monte el directorio local en el contenedor, por ejemplo:

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

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

tl; dr Cree su propio boot2docker.iso personalizado con VirtualBox Guest Additions (vea el enlace ) o descargue http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso y guárdelo a ~ / .boot2docker / boot2docker.iso.

mate
fuente
Intenté usar esa iso y todavía me encontré con los mismos problemas ... Sin embargo, usar las instrucciones descritas en esa publicación me ayudó a resolverlo, básicamente tuve que forzar la carpeta compartida.
Jaco Pretorius
Utilicé la iso, tropecé porque no había detenido la Virtual Box VM antes de llamar al cmd 'VBoxManage sharedfolder add ...'. Finalmente conseguí que todo funcionara, aunque muchas gracias.
Emile
Nota: la razón por la que -v arg no funciona a través de boot2docker, aparentemente tiene algo que ver con el montaje en boot2docker-vm y no con su host real. por eso supongo que la parte de Vboxmanage lo ayuda a funcionar.
Emile
5

¿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.

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 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).

Emile
fuente
5

Tuve el mismo problema Encontré esto en la documentación de la ventana acoplable :

Nota: El directorio del 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 admite pasar un directorio de host, porque las imágenes compiladas 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 -vparámetro en el docker runcomando, ya que las otras respuestas señalan correctamente.

matthaeus
fuente
¿Qué es exactamente el directorio de host?
Nicolas S.Xu
@ NicolasS.Xu Cualquier ruta en la máquina host docker real.
J. Scott Elblein
5

Aquí hay un ejemplo con una ruta de Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

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 AutoHotkeyscript 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 Keymientras 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.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 
J. Scott Elblein
fuente
4

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 /datacontenedor.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
fuente
3

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
Chankey Pathak
fuente
3

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

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

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.

Sunil Chauraha
fuente
2

También puede hacer esto con la aplicación web Portainer para una experiencia visual diferente.

Primero tire de la imagen Portainer:

docker pull portainer/portainer

Luego cree un volumen para Portainer:

docker volume create portainer_data

También cree un contenedor Portainer:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/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.

ajustes de volumen vinculante

PD: estoy usando Docker 19.035 y Portainer 1.23.1

Michael Fayad
fuente