¿Cuál es el propósito de VOLUME en Dockerfile?

106

Estoy tratando de profundizar en mi comprensión del volumen de Docker y me está costando descubrir las diferencias / caso de uso de:

  • El docker volume createcomando
  • los docker run -v /path:/host_path
  • La VOLUMEentrada en el Dockerfilearchivo

Particularmente, no entiendo qué sucede si combinas la VOLUMEentrada con la -vbandera.

radio226
fuente
1
relacionado: stackoverflow.com/a/46992367/3160529
Shubham

Respuestas:

70

Un volumen es un dato persistente almacenado en /var/lib/docker/volumes/...

  • Puede declararlo en un Dockerfile, lo que significa que cada vez que se inicia un contenedor desde la imagen, el volumen se crea ( vacío ), incluso si no tiene ninguna -vopción.

  • Puede declararlo en tiempo de ejecución docker run -v [host-dir:]container-dir.
    La combinación de los dos ( VOLUME+ docker run -v) significa que puede montar el contenido de una carpeta de host en su volumen persistente por el contenedor en/var/lib/docker/volumes/...

  • docker volume create crea un volumen sin tener que definir un Dockerfile y crear una imagen y ejecutar un contenedor. Se utiliza para permitir rápidamente que otros contenedores monten dicho volumen.

Si había persistido algún contenido en un volumen, pero desde entonces eliminó el contenedor (que por defecto no elimina su volumen asociado, a menos que esté usando docker rm -v), puede volver a adjuntar dicho volumen a un nuevo contenedor (declarando el mismo volumen).

Consulte " Docker: ¿cómo acceder a un volumen no adjunto a un contenedor? ".
Con la creación de volumen de Docker, es fácil volver a adjuntar un volumen con nombre a un contenedor.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
VonC
fuente
2
Digamos que usa Dockerfilecon VOLUMEy la -v /path:/host_path/bandera. El contenido de VOLUMEserá reemplazado por el contenido de /host_path/?
radio226
Gracias a ti @VonC, creo que lo entiendo :) Y si haces una docker volume create --name my_volumeseguida de a docker run --volume-from my_volume, ¿cómo sabes dónde estará el punto de montaje?
radio226
@ radium226 sin punto de montaje (es decir, nada montado desde el host, además del vacío nativo / var / lib / docker / volume). La ruta del volumen está en los metadatos my_volume: stackoverflow.com/a/31997267/6309
VonC
Entiendo que no hay ningún punto de montaje en el lado del host. Pero dentro del contenedor en ejecución lanzado con docker run ..., ¿cómo puedo escribir en un archivo almacenado en el my_volumevolumen? No conozco el ... camino? del volumen dentro de mi contenedor en ejecución porque no definí nada? Espero ser lo suficientemente claro, porque definitivamente no estoy seguro de mi vocabulario: - /
radio226
1
@ radium226 docker volume create --name anamecrea un volumen con nombre : usted asigna una ruta de contenedor en tiempo de ejecución docker run -v aname:/apath:: ese contenedor ahora tiene un volumen adjunto, montado en su carpeta / apath. He reescrito la respuesta para que quede claro.
VonC
11

VOLUMELa instrucción se vuelve interesante cuando la combina con el volumes-fromparámetro de tiempo de ejecución.

Dado el siguiente Dockerfile:

FROM busybox
VOLUME /myvolume

Construye una imagen con:

docker build -t my-bb .

Y gira un recipiente con:

docker run --rm -it --name my-first-bb my-bb

Lo primero que debe notar es que tendrá una carpeta en esta imagen llamada myvolume. Pero no es particularmente interesante ya que al salir del contenedor también se eliminará el volumen.

Cree un archivo vacío en esta carpeta, así que ejecute lo siguiente en el contenedor:

cd myvolume
touch hello.txt

Ahora encienda un nuevo contenedor, pero comparta el mismo volumen con my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Verá que my-second-bbcontiene el archivo hello.txten la myvolumecarpeta.

Una vez que salga de ambos contenedores, su volumen también se eliminará.

Koray Tugay
fuente
Los volúmenes se eliminarán porque son volúmenes anónimos Y usted inició los contenedores con la --rmopción. Creo que podría funcionar mencionarlo. Si no inició un contenedor con --rm, aún puede eliminar el contenedor y sus volúmenes anónimos con docker rm -v my-container.
AymDev