Saltar al contenido

Docker Compose: volúmenes sin dos puntos (:)

Te damos la bienvenida a proyecto online, aquí vas a encontrar la solucíon que estabas buscando.

Solución:

Solo para complementar la respuesta aceptada, según la base de conocimiento de Docker, hay tres tipos de volúmenes: anfitrión, anónimoy llamado:

  • A volumen de host vive en el sistema de archivos del host Docker y se puede acceder desde dentro del contenedor. Ejemplo de ruta de volumen:

    /path/on/host:/path/in/container

  • Un volumen anonimo es útil cuando prefiere que Docker maneje dónde se almacenan los archivos. Sin embargo, puede ser difícil hacer referencia al mismo volumen a lo largo del tiempo cuando se trata de volúmenes anónimos. Ejemplo de ruta de volumen:

    /path/in/container

  • A volumen con nombre es similar a un volumen anónimo. Docker administra en qué parte del disco se crea el volumen, pero le asigna un nombre de volumen. Ejemplo de ruta de volumen:

    name:/path/in/container

La ruta utilizada en su ejemplo es una volumen anonimo.

[Refreshing this answer since it seems others have similar questions]

Hay tres tipos de volúmenes en docker:

  • Volúmenes de host: estos asignan una ruta desde el host al contenedor con un montaje de enlace. Tienen la sintaxis corta /path/on/host:/path/in/container. Lo que exista en el host es lo que será visible en el contenedor, no hay combinación de archivos ni inicialización desde la imagen, y los uid/gid no obtienen ninguna asignación especial, por lo que debe tener cuidado de permitir que el contenedor uid/gid lea y acceso de escritura a esta ubicación (una excepción es Docker para Mac con OSXFS). Si la ruta en el host no existe, la ventana acoplable creará un directorio vacío como raíz y, si es un archivo, puede montar un solo archivo en el contenedor de esta manera.

  • Volúmenes con nombre: estos tienen un nombre, en lugar de una ruta de host como fuente. Tienen la sintaxis corta name:/path/in/container y en un archivo de redacción, también debe definir el volumen con nombre utilizado en los contenedores en el nivel superior. De forma predeterminada, estos también son un montaje de enlace, pero a un directorio específico de Docker en /var/lib/docker/volumes que debe ser considerado interno. Sin embargo, estos valores predeterminados se pueden cambiar para permitir cosas como montajes NFS, montaje de discos o incluso sus propios montajes de enlace a otras ubicaciones. Los volúmenes con nombre también tienen una función en la ventana acoplable, cuando son nuevos o están vacíos y se usan por primera vez, la ventana acoplable copia el contenido de la imagen en el volumen con nombre antes de montarlo. Esto incluye archivos, directorios, propietarios de uid/gid y permisos. Después de eso, se comportan de manera idéntica a un volumen host, lo que sea que esté dentro del volumen se superpone a la ubicación de la imagen.

  • Volúmenes anónimos: estos solo tienen un camino dentro del contenedor. estan en forma /path/in/container y docker creará un volumen con nombre predeterminado con un guid como nombre. Comparten los comportamientos de los volúmenes con nombre, almacenan archivos en /var/lib/docker/volumes, se inicializan con el contenido de la imagen, excepto que tienen un GUID generado aleatoriamente que no indica cómo o incluso si se están utilizando. Puede montar el volumen en otro contenedor e inspeccionar el contenido, o puede encontrar el contenedor usando el volumen inspeccionando cada contenedor para encontrar el GUID. Si crea un contenedor con el --rm marca, los volúmenes anónimos también se eliminarán automáticamente.

  • tmpfs: Espera, dije 3, ¿y esto es 4? Eso es porque tmpfs no se considera un volumen, la sintaxis para montarlo es diferente. El resultado es un puntero a un sistema de archivos vacío en la memoria. Esto es útil si tiene archivos temporales que no desea guardar, son relativamente pequeños y necesita velocidad o quiere asegurarse de que no se guarden en el disco.

En el caso del OP:

  • /usr/app se monta desde el host, comúnmente utilizado para el desarrollo
  • /usr/app/node_modules es un volumen anónimo inicializado a partir de la imagen

¿Por qué hacer esto? Probablemente porque no desea modificar el node_modules directorio en el host, especialmente si hay datos específicos de la plataforma y está ejecutando en el escritorio de Docker donde es Mac/Win en el host y Linux en el contenedor. También es posible que haya datos en la imagen a los que desea acceder dentro de la estructura de directorios del otro montaje de volumen.

¿Hay desventajas en los volúmenes anónimos? Dos que se me ocurren:

  • si hay algo en /usr/app/node_modules que desea reutilizar en un contenedor futuro, es poco probable que encuentre el volumen anterior. Tiendo a considerar cualquier dato escrito en estos como probablemente perdido.

  • A menudo encontrará los volúmenes en el host llenos de GUID a lo largo del tiempo, y no está claro cuáles están en uso y cuáles se pueden eliminar. Los volúmenes anónimos no utilizados son una de las varias causas del uso excesivo del disco en Docker.

Para obtener más detalles sobre los volúmenes de Docker, consulte: https://docs.docker.com/storage/


Respuesta original:

El segundo crea un volumen anónimo. Se enumerará en docker volume ls con una identificación larga y única en lugar de un nombre. Docker-compose podrá reutilizar esto si actualiza su imagen, pero es fácil perder la noción de qué volumen pertenece a qué con esos nombres, por lo que recomiendo siempre darle un nombre a su volumen.

Tuve la misma pregunta mientras realizaba este tutorial, y la respuesta a lo que esas líneas podrían estar haciendo en realidad es esta:

Sin el volumen anónimo (‘/usr/src/app/node_modules’), el directorio node_modules esencialmente desaparecería al montar el directorio host en tiempo de ejecución:
Construir – Se crea el directorio node_modules.
Correr – El directorio actual se copia en el contenedor, sobrescribiendo los node_modules que se acaban de instalar cuando se creó el contenedor.

los docker-compose.yml archivo para esto:

version: '3.5'

services:

  something-clever:
    container_name: something-clever
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - '.:/usr/src/app'
      - '/usr/src/app/node_modules'
    ports:
      - '4200:4200'

Te mostramos reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *