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 lo uso, sudo docker -v /somedir run ...
entonces termino con un nuevo contenedor nuevo, por lo que habría instalado Java y haría 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?
docker
etiqueta son 34k + , que son mucho más que esos dos sitios stackoverflow.com/questions/tagged/dockerRespuestas:
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:
Si todo está bien, detenga su contenedor anterior y use este nuevo.
Eso es :)
fuente
newnameofcontainer
que probablemente debería nombrarsenew_image_name
, porquedocker commit
crea una nueva imagen en tu sistema. Luego, en lo siguiente, cuando haga unadocker run
, realmente usará el nombre de la imagen desde la que desea ejecutar un nuevo contenedor. Lo anterior funciona, pero solo quería aclarar a los demás que el marcador de posición newnameofcontainer anterior es en realidad el nombre de una nueva imagen. ¡Gracias! respuesta asombrosa oh, puedes ver la imagen recién creada desde el primer comando de confirmación de Docker usandodocker image ls
docker run -v /srv/a:/tmp ubuntu:14.04
es buenoNo 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: -
Para referencia ver:
https://docs.docker.com/engine/reference/commandline/cp/
fuente
He montado correctamente la
/home/<user-name>
carpeta de mi host en la/mnt
carpeta del contenedor existente (no en ejecución). 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).Encuentra
MountPoints
sección, que estaba vacío en mi caso:"MountPoints":{}
. Luego reemplace el contenido con algo como esto (puede copiar el contenido adecuado de otro contenedor con la configuración adecuada):o lo mismo (formateado):
service docker restart
Esto funciona para mí con Ubuntu 18.04.1 y Docker 18.09.0
fuente
systemctl stop docker.service
2. Editarconfig.v2.json
:vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)
3. Guardar actualizaciones en un archivo::w config.v2.json
4. Salir de vim::q!
5. Actualizar el archivo existente:jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.json
6. Iniciar el motor de la ventana acoplable:systemctl start docker.service
7. Iniciar el contenedor si es necesario :docker start <container-name/ID>
8. Disfruta :-)service docker restart
. Traté de quedocker restart <container>
la nueva configuración no se recoja, y la configuración anterior la sobrescribe.jq
ayudará a imprimir bastante el JSON para que sea más humano editable:cat config.v2.json | jq . > config.json
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
YMMV
fuente
Lamentablemente, la opción de cambio para montar un volumen solo se encuentra en el
run
comando.docker run --help
-v, --volume list Bind mount a volume (default [])
Sin embargo, hay una manera de evitar esto para que no tenga que reinstalar las aplicaciones que ya ha configurado en su contenedor.
docker container export -o ./myimage.docker mycontainer
docker import ./myimage.docker myimage
docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
fuente
docker container
no es un comando válido en 1.11.2 (que es la última versión admitida por Synology a partir de este escrito). Sin embargo, no puedo encontrar ningún documento que indique cuándo se agregó. En este caso, el primer comando esdocker export -o ./myimage.docker mycontainer
.¡Una nota para usar los contenedores de Docker Windows después de que tuve que buscar este problema durante mucho tiempo!
Condiciones:
Problema:
Solución como se describe aquí parcialmente:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
mkdir DirForMount
docker container stop <CONTAINERID>
docker commit <CONTAINERID> <NEWIMAGENAME>
docker container rm <CONTAINERID>
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.
fuente
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 contenedorDEST_PATH
está en localhostLuego
docker-compose down
adjunte un volumen al mismoDEST_PATH
y ejecute contenedores Docker utilizandodocker-compose up -d
Agregue volumen siguiendo en
docker-compose.yml
fuente