Me cuesta entender cómo funciona exactamente el volumen con nombre en el siguiente ejemplo de docker docs :
version: "3" services: db: image: db volumes: #1 - data-volume:/var/lib/db backup: image: backup-service volumes: #2 - data-volume:/var/lib/backup/data volumes: data-volume:Mi conjetura es que la primera aparición del volumen con nombre (# 1) define lo que está contenido dentro del volumen, mientras que las ocurrencias posteriores (# 2) simplemente comparten el contenido del volumen con los contenedores desde los que se hace referencia.
¿Es correcta esta conjetura?
Listado data-volume: debajo de los volumes: la clave crea un volumen con nombre en el host si aún no existe. Esto se comporta de la siguiente manera según esta fuente
Si crea un volumen con nombre ejecutando un nuevo contenedor desde image by
docker run -v my-precious-data:/data imageName, los datos dentro de la imagen/contenedor bajo /data se copiarán en el volumen con nombre.Si crea otro contenedor vinculado a un volumen con nombre existente, no se copiarán/sobrescribirán archivos de la nueva imagen/contenedor, utilizará los datos existentes dentro del volumen con nombre.
No tienen un comando docker para hacer una copia de seguridad/exportar un volumen con nombre. Sin embargo, puede averiguar la ubicación real del archivo mediante "docker volume inspect [volume-name]".
En caso de que el volumen esté vacío y ambos contenedores tengan datos en el directorio de destino, el primer contenedor que se ejecutará montará sus datos en el volumen y el otro contenedor verá esos datos (y no los suyos). No sé qué contenedor se ejecutará primero (aunque espero que se ejecute de arriba a abajo), sin embargo, puede forzar un pedido con depends_on como se muestra aquí .
------------------- Actualizar
La opción depend_on se ignora cuando se implementa una pila en modo de enjambre con un archivo Compose de la versión 3.
De la forma en que entiendo tu conjetura, no estás completamente en lo cierto.
Declarar y hacer referencia a un volumen con nombre en un archivo docker-compose creará un volumen vacío al que luego podrán acceder y compartir los servicios diciéndolo en su sección de volúmenes.
Si desea compartir un volumen con nombre, debe declarar este volumen en la sección de volumen de nivel superior de su archivo docker-compose. Ejemplo (como en los documentos de la ventana acoplable ya vinculados por usted mismo):
version: "3" services: db: image: db volumes: #1 uses the named and shared volume 'data-volume' created with #3 - data-volume:/var/lib/db backup: image: backup-service volumes: #2 uses the named and shared volume 'data-volume' created with #3 - data-volume:/var/lib/backup/data volumes: #3 creates the named volume 'data-volume' data-volume:El volumen estará vacío al inicio (y por lo tanto las carpetas en los contenedores donde se monta ese volumen). Su contenido será el resultado de las acciones de los servicios en tiempo de ejecución.
Espero haberlo dejado un poco más claro.