Cómo establecer una ruta en el host para un volumen con nombre en docker-compose.yml

82

El siguiente ejemplo crea un volumen llamado dbdata y lo hace referencia dentro del servicio db :

version: '2'
services:
  db:
    image: mysql
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:
    driver: local

(de https://stackoverflow.com/a/35675553/4291814 )

Puedo ver la ruta para el volumen predeterminado a:

/var/lib/docker/volumes/<project_name>_dbdata

Mi pregunta es cómo configurar la ruta en el host para el dbdatavolumen.

misha
fuente

Respuestas:

70

Con el localcontrolador de volumen viene la capacidad de usar montajes arbitrarios; Al usar un montaje de enlace , puede lograr exactamente esto.

Para configurar un volumen con nombre que se monta en /srv/db-data, docker-compose.ymlse vería así:

version: '2'
services:
  db:
    image: mysql
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/srv/db-data'

No lo he probado con la versión 2 del formato de archivo de composición, pero https://docs.docker.com/compose/compose-file/compose-versioning/#version-2 no indica que no debería funcionar.

Tampoco lo he probado en Windows ...

Christian Ulbrich
fuente
3
Puede usar un montaje de enlace con una sintaxis mucho más simple que esa: volúmenes: - ./dbdata:/var/lib/mysql. El único 'problema' con un montaje de enlace es que no copiará el contenido del contenedor al host automáticamente, a diferencia de un volumen con nombre. docs.docker.com/compose/compose-file/#volumes
mikey
12
OP preguntó específicamente sobre volúmenes con nombre , no cómo usar un montaje de enlace de la manera más fácil. Si desea configurar la ruta para un volumen con nombre, puede lograrlo con un montaje de enlace, como se muestra arriba. El uso de volúmenes con nombre tiene la ventaja de que simplemente puede reutilizarlos en su docker-compose.yml.
Christian Ulbrich
Lo siento Christian, no me di cuenta de que este / estaba / usando un volumen con nombre. Pensé que esto estaba presentando cómo usar un montaje de enlace. Esta parece ser la solución correcta (consulte: stackoverflow.com/a/45039609/3080207).
mikey
¿A qué te refieres con monturas arbitrarias? ¿Es una ruta aleatoria sobre el contenedor de la ventana acoplable o sobre la máquina host? Gracias.
Amr Afifi
Puede utilizar montajes arbitrarios en el host, por ejemplo. de esta manera, también podría montar algo con say sshfs y enlazarlo a montarlo en un volumen con nombre.
Christian Ulbrich
8

Docker administra la ubicación de los volúmenes con nombre; si desea especificar la ubicación usted mismo, puede "enlazar montar" un directorio de host o utilizar un complemento de volumen que le permita especificar una ruta.

Puede encontrar algunos detalles en otra respuesta que publiqué recientemente; https://stackoverflow.com/a/36321403/1811501

thaJeztah
fuente
1
En realidad, solo tiene que usar el localcomplemento de volumen, que se proporciona con la ventana acoplable; vea mi respuesta como ejemplo.
Christian Ulbrich
0

A partir de docker-compose v3.2ahora, puede hacerlo de la siguiente manera:

Nota: Muchos, como supuse que si pones version: "3"usaría el V3 más nuevo / más reciente, no lo usa v3.0, DEBES especificar como mínimo 3.2para usar el método de configuración a continuación.

https://docs.docker.com/compose/compose-file/#volumes

version: "3.2"
services:
  db:
    image: postgres:latest
    volumes: 
      - type: volume
        source: /opt/db/vols/dbdata
        target: /var/lib/postgresql/data
        volume:
          nocopy: true



volumes:
   dbdata:

Nota:

Los volúmenes nombrados deben aparecer debajo de la clave de volúmenes de nivel superior, como se muestra.

FreeSoftwareServers
fuente
Lo siento si no entendí su respuesta @FreeSoftwareServer, la pregunta aquí es "¿Cómo podemos asignar volúmenes con nombre a la carpeta del host"?
Dheeraj Kumar
Intenté simplificar mi respuesta, quizás comenzar una nueva pregunta con su problema específico. @Dheeraj Kumar
FreeSoftwareServers
¿Cómo se dbdataasigna el servicio dbsegún su volumen? @FreeSoftwareServers
Nam G VU
¿La línea de origen? @NamGVU Quizás una nueva pregunta con su problema específico sería mejor
FreeSoftwareServers