tag run name library imagenes hub example dockers container change docker

run - dockers container download



¿Cómo puedo agregar un volumen a un contenedor Docker existente? (7)

¡Una nota para usar los contenedores de Docker Windows después de que tuve que buscar este problema durante mucho tiempo!

Condiciones:

  • Windows 10
  • Docker Desktop (última versión)
  • utilizando Docker Windows Container para image microsoft / mssql-server-windows-developer

Problema:

  • Quería montar un diccionario de host en mi contenedor de Windows.

Solución como se describe aquí parcialmente:

  • crear contenedor acoplable

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer

  • ir a shell de comando en contenedor

docker exec -it <CONTAINERID> cmd.exe

  • crear DIR

mkdir DirForMount

  • detener el contenedor

docker container stop <CONTAINERID>

  • confirmar contenedor

docker commit <CONTAINERID> <NEWIMAGENAME>

  • eliminar contenedor antiguo

docker container rm <CONTAINERID>

  • crear un nuevo contenedor con nueva imagen y montaje de volumen

docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:/DirToMount:C:/DirForMount <NEWIMAGENAME>

Después de esto, resolví este problema en los contenedores de ventanas acoplables.

Tengo un contenedor Docker que he creado simplemente instalando Docker en Ubuntu y haciendo:

sudo docker run -i -t ubuntu /bin/bash

Inmediatamente comencé a instalar Java y algunas otras herramientas, pasé un tiempo con él y detuve el contenedor

exit

Luego quise agregar un volumen y me di cuenta de que esto no es tan sencillo como pensé que sería. Si uso sudo docker -v /somedir run ... entonces termino con un nuevo contenedor nuevo, por lo que tendría que instalar Java y hacer lo que ya he hecho antes solo para llegar a un contenedor con un volumen montado.

Toda la documentación sobre el montaje de una carpeta desde el host parece implicar que montar un volumen es algo que se puede hacer al crear un contenedor. Entonces, la única opción que tengo para evitar reconfigurar un nuevo contenedor desde cero es enviar el contenedor existente a un repositorio y usarlo como la base de uno nuevo mientras se monta el volumen.

¿Es esta la única forma de agregar un volumen a un contenedor existente?


He montado correctamente la carpeta /home/<user-name> de mi host en la carpeta /mnt del contenedor existente (no se está ejecutando). Puedes hacerlo de la siguiente manera:

  1. Abra el archivo de configuración correspondiente al contenedor detenido, que se puede encontrar en /var/lib/docker/containers/99d...1fb/config.v2.json (puede ser config.json para versiones anteriores de docker).

  2. Buscar la sección MountPoints , que estaba vacía en mi caso: "MountPoints":{} . A continuación, reemplace el contenido con algo como esto (puede copiar el contenido adecuado de otro contenedor con la configuración adecuada):

    "MountPoints":{"/mnt":{"Source":"/home/<user-name>","Destination":"/mnt","RW":true,"Name":"","Driver":"","Type":"bind","Propagation":"rprivate","Spec":{"Type":"bind","Source":"/home/<user-name>","Target":"/mnt"},"SkipMountpointCreation":false}}

    o lo mismo (formateado):

"MountPoints": { "/mnt": { "Source": "/home/<user-name>", "Destination": "/mnt", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/home/<user-name>", "Target": "/mnt" }, "SkipMountpointCreation": false } }

  1. Reinicie el servicio de docker: service docker restart

Esto funciona para mí con Ubuntu 18.04.1 y Docker 18.09.0


La mejor manera es copiar todos los archivos y carpetas dentro de un directorio en su sistema de archivos local: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

SRC_PATH está en el contenedor DEST_PATH está en localhost

Luego, docker-compose down adjunte un volumen al mismo DEST_PATH y ejecute contenedores Docker utilizando docker-compose up -d

Agregue volumen siguiendo en docker-compose.yml

volumes: - DEST_PATH:SRC_PATH


Lamentablemente, la opción de cambio para montar un volumen solo se encuentra en el comando de run .

docker run --help

-v, --volume list Bind mount a volume (default [])

Sin embargo, hay una forma de evitar esto para que no tenga que reinstalar las aplicaciones que ya ha configurado en su contenedor.

  1. Exporte su contenedor docker container export -o ./myimage.docker mycontainer
  2. Importar como una imagen docker import ./myimage.docker myimage
  3. Luego, docker run -i -t -v /somedir --name mycontainer myimage /bin/bash

No tenemos ninguna forma de agregar volumen en el contenedor en ejecución, pero para lograr este objetivo puede usar los siguientes comandos:

Copie archivos / carpetas entre un contenedor y el sistema de archivos local: -

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

Para referencia ver:

https://docs.docker.com/engine/reference/commandline/cp/


Puede confirmar su contenedor existente (es decir, crear una nueva imagen a partir de los cambios del contenedor) y luego ejecutarlo con sus nuevas monturas.

Ejemplo:

$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5a8f89adeead ubuntu:14.04 "/bin/bash" About a minute ago Exited (0) About a minute ago agitated_newton $ docker commit 5a8f89adeead newimagename $ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash

Si todo está bien, detenga su antiguo contenedor y use este nuevo.

Eso es :)


Jérôme Petazzoni tiene una publicación de blog bastante interesante sobre cómo adjuntar un volumen a un contenedor mientras se está ejecutando . Esto no es algo integrado en Docker de fábrica, pero es posible lograrlo.

Como él también señala

Esto no funcionará en sistemas de archivos que no estén basados ​​en dispositivos de bloque.

Solo funcionará si / proc / mounts enumera correctamente el nodo del dispositivo de bloque (que, como vimos anteriormente, no es necesariamente cierto).

Además, solo probé esto en mi entorno local; Ni siquiera probé una instancia en la nube o algo así

YMMV