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:
-
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 serconfig.json
para versiones anteriores de docker). -
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
}
}
-
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.
-
Exporte su contenedor
docker container export -o ./myimage.docker mycontainer
-
Importar como una imagen
docker import ./myimage.docker myimage
-
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:
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