¿Cómo se supone que debe verse la sintaxis de "volúmenes" de Docker Compose versión 2?

43

Con Docker Compose v1.6.0 +, ahora hay una nueva sintaxis de archivo / versión 2 para el docker-compose.ymlarchivo. Los cambios incluyen una clave de nivel superior separada llamada volumes. Esto permite "centralizar" las definiciones de volumen en un solo lugar.

Lo que estoy tratando de hacer es nombrar volúmenes allí y tener una ruta múltiple de referencia de volumen único en mi disco host local. El siguiente es un ejemplo, arrojando una excepción con un Tracebackque termina con

AttributeError: 'list' object has no attribute 'items'

Ejemplo docker-compose.yml:

version: '2'

services:
  db:
    image: postgres
    volumes:
      - database:/var/lib/postgres/data

  php:
    image: php-fpm:5.6
    volumes:
      - phpconf:/etc/php/conf.d

  namedvolume:
    container_name: namedvolume
    build: ./Docker/Testvolume
    volumes: 
      - ./Docker/Testvolume/shareme

volumes:
  database:
    - ./Docker/Postgres/db:ro
    - ./Docker/Postgres/ini
  phpconf:
    - ./Docker/PHP-FPM/conf
  singledir: ./Docker/foo
  completemap: ./Docker/bar:/etc/service/conf.d
  - namedvolume:/etc/service/conf.d # < this was a separate attempt w/o the other keys
  … ?

Hasta ahora, leí toda la referencia de configuración de Docker Compose docs master-branch Volume, Docker Compose docs Volume / Volume-Driver reference y busqué en los ejemplos de GitHub para encontrar la sintaxis correcta que se espera. Parece que nadie ya está usando eso (GitHub) y la documentación está lejos de estar completa (docker.com). También intenté construir un volumen separado servicey hacer referencia a él volumes, pero eso tampoco funciona. ¿Alguna idea de cómo se supone que debe ser esta sintaxis?

emperador
fuente

Respuestas:

40

Propósito de la volumesllave

Está ahí para crear volúmenes con nombre .

Si no lo usa, se encontrará con un montón de valores hash para sus volúmenes. Ejemplo:

$ docker volume ls 
DRIVER              VOLUME NAME
local               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55
local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

Con volúmenes con nombre, obtienes algo como lo siguiente:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Cómo crear volúmenes con nombre

La docker-compose.ymlsintaxis es:

version: '2'

services:
    app:
        container_name: app
        volumes_from:
            - appconf
    appconf:
        container_name: appconf
        volumes:
            - ./Docker/AppConf:/var/www/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Esto es algo como lo que se muestra arriba.

Cómo eliminar volúmenes a granel

Cuando tienes un montón de hash, puede ser bastante difícil de limpiar. Aquí hay una frase:

docker volume rm $(docker volume ls |awk '{print $2}')

Editar: como @ArthurTacca señaló en los comentarios, hay una manera más fácil de recordar:

docker volume rm $(docker volume ls -q)

Cómo obtener detalles sobre un volumen con nombre

Ahora que ya no tiene que buscar hashes, puede continuar y llamarlos por su ...  nombre:

docker volume inspect <volume_name>

# Example:
$ docker volume inspect projectname_appconf

[
    {
        "Name": "projectname_appconf",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/projectname_appconf/_data"
    }
]

Nota al margen: es posible que desee que docker-compose downsus servicios comiencen de nuevo antes de crear volúmenes.

En caso de que esté utilizando Boot2Docker / Docker Machine , deberá hacerlo docker-machine sshy sudo -iantes de hacer uno ls -la /mnt/…de ese volumen: su máquina host es la VM aprovisionada por Docker Machine .

emperador
fuente
1
Muy buena respuesta. aclamaciones. Despejó mucho volviendo para encontrar nuevos volúmenes compuestos por docker.
Derek Adair el
¿Dónde encontraste esto? parece mucho más duro que los docker docs?
Derek Adair
1
@DerekAdair Gracias, pero como puede leer en las estadísticas en la esquina superior izquierda, esta respuesta está bien referenciada en las páginas de resultados del motor de búsqueda de Google sobre este tema.
kaiser
1
En lugar de $(docker volume ls |awk '{print $2}')que pueda usar $(docker volume ls -q)No solo es esto más simple, no imprime "VOLUMEN" en la primera línea.
Arthur Tacca
2
Esto no es correcto; esto no hace lo que hace que parezca que lo hace. volumes_fromes heredar la lista de volúmenes de otro contenedor. Para usar un volumen con nombre, usa la sintaxis de nivel de servicio - NAME:DESTy establece la ruta en la volumesclave de nivel superior . Lo que hace este ejemplo (al momento de escribir esto) es hacer un volumen estándar además de un volumen con nombre, y el volumen con nombre simplemente no se usa.
trevorj
13

Según tengo entendido, puede usar la volumes:sección global para

  • definir un nombre de volumen
  • hacer que un volumen con nombre esté disponible con un nombre de volumen diferente
  • especificar un controlador y opciones de controlador para un volumen con nombre

Los volúmenes en la sección global se crearán automáticamente a menos que usted especifique external: true. Aún tendrá que decirle a cada servicio en su volumes:sección dónde montar ese volumen.

Aquí hay un ejemplo muy simple:

version: '2'
volumes:
  project:
services:
  one:
    volumes:
      - project:/bar
  two:
    volumes:
      - project:/foo

La volumes:entrada global para projecthará projectque se cree un volumen con nombre . Luego se monta como /baren el servicio uno y como /fooen el servicio dos. Ambos servicios comparten los datos del volumen y pueden leerlo / escribirlo.

No creo que lo que intentas hacer sea posible (convertir múltiples rutas en un solo volumen y con diferentes r / w flags). Si es posible, entonces probablemente encontrando una manera de crear un volumen con nombre con estas propiedades a través de otros medios y luego agregándolo como un volumen externo:

volumes:
  mymagicvolume:
    external: true
rompecabezas
fuente
1
Ya votó de nuevo, pero justo hoy encontró tiempo para evitarlo y agregó datos extendidos. ¡Gracias por toda tu ayuda! Pregunta: Al nombrar el volumen projecty luego hacer referencia a él project:/bar, ¿dónde están projectrealmente definidas las rutas?
Kaiser
docker-compose los creará automáticamente como volúmenes con nombre en / var / lib / docker / volume / volumename
JamesCW
Lo sentimos, ¿todavía no entiendo de dónde obtiene Docker un camino para el project:alias? ¿Cómo sabe Docker si quiero compartir, digamos ./some_folder/some_subfolder/yet_another_subfoldera los contenedores one:y two:?
Alexander Lomia
En ese caso es "proyecto: <whateverpath>" debajo de los volúmenes de nivel superior: sección
Balint Bako
5

Consulte la Versión 2, por ejemplo, también la referencia de configuración de Volumen :

Mi ejemplo: (Versión 1)

$ tail -4 docker-compose.yml 
  volumes:
    - ./etc/nginx/conf.d:/etc/nginx/conf.d:ro
    - ./var/log/nginx:/var/log/nginx:rw
    - ./var/www/html:/var/www/html:rw
$ 
alexus
fuente
1
Esto es exactamente lo que vinculé en la pregunta y, por lo tanto, no responde a mi pregunta. ¿Le importaría publicar un ejemplo de cómo asignar diferentes directorios del host como un volumen con nombre a múltiples servicios?
Kaiser
mi enlace ES diferente, apunta a la Version 2sección del documento)
alexus
Mi error. Simplemente olvidé vincular eso también. Cuando miras las cosas de YML en la pregunta, puedes ver que claramente traté de usar la volumestecla de nivel superior por separado , lo cual no hice, de ahí la pregunta. Lo que no entiendo es lo que la docker-compose.ymlparte con la sintaxis de la versión 1 está destinada a explicarme.
Kaiser
5

Creo que lo que intentas hacer es más o menos lo mismo que se ve aquí . En resumen: actualmente no es posible crear un volumen con nombre que se refiera a un punto de montaje en el host. Puede crear un volumen con nombre para compartir datos entre contenedores, pero los datos solo existirán en el volumen mismo y desaparecerán cuando elimine el volumen.

Se ha propuesto el montaje de volúmenes con nombre , pero desafortunadamente no se agregará al núcleo en un futuro próximo. Sin embargo, es posible mediante el uso de un complemento docker llamado local-persist .

Lijadora
fuente
3
Montar volúmenes con nombre ahora es una cosa ... desde 1.11 o 1.12.
kaiser