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

Con Composición de Docker v1. 6. 0+, ahora hay una nueva sintaxis de archivo / versión 2 para el docker-compose.yml file. Los cambios incluyen una clave de nivel superior independiente denominada volumes. Esto permite "centralizar" las definiciones de volumen en un solo lugar.

Lo que estoy tratando de hacer es nombre los volúmenes están allí y tienen un solo volumen que hace referencia a varias rutas en mi disco host local. El siguiente es un ejemplo, lanzando una excepción con un Traceback que 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/sharemevolumes:  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 he leído a través de todos los Documentos de Docker Compose master-Sucursal Referencia de configuración de volumen, el Documentos de Docker Compose Volumen / Volumen-Referencia del controlador y revisado 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 como service y referenciarlo en volumes, pero eso no funciona tan bien. ¿Alguna idea de cómo se supone que debe verse esta sintaxis?

Finalidad de la volumes clave

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

Si lo haces ni úselo, luego se encontrará con un montón de valores hash para sus volúmenes. Ejemplo:

$ docker volume ls DRIVER              VOLUME NAMElocal               f004b95d8a3ae11e9b871074e9415e24d536742abfe86b32ffc867f7b7063e55local               9a148e167e1c722cbdb67c8edc36f02f39caeb2d276e9316e64de36e7bc2c35d

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

$ docker volume lslocal               projectname_someconflocal               projectname_otherconf

Cómo crear volúmenes con nombre

El docker-compose.yml la sintaxis es:

version: '2'services:    app:        container_name: app        volumes_from:            - appconf    appconf:        container_name: appconf        volumes:            - ./Docker/AppConf:/var/www/confvolumes:    appconf:networks:    front:        driver: bridge

Esto es algo así como los volúmenes con nombre que se muestran arriba.

Cómo eliminar volúmenes de forma masiva

Cuando tienes un montón de hashes, puede ser bastante difícil de limpiar. Aquí hay una sola línea:

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 docker-compose down sus servicios para obtener un nuevo comienzo antes de ir a crear volúmenes.

En caso de que esté utilizando Boot2Docker (en inglés)/ Máquina Acoplable, tendrás que docker-machine ssh y sudo -i antes de hacer un ls -la /mnt/… de ese volumen, su máquina host es la máquina virtual aprovisionada por Máquina Acoplable.

EDITAR: Otro respuesta relacionada sobre volúmenes con nombre en SO.

Tal como lo entiendo, puedes usar el global volumes: sección a

  • 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 de la sección global se crearán automáticamente a menos que especifique external: true. Aún tendrá que informar 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

Global volumes: entrada para project causará un volumen con nombre project para ser creado. Luego se monta como /bar en el servicio uno, y como /foo en el servicio dos. Ambos servicios comparten los datos del volumen y pueden leerlos y escribirlos.

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

volumes:  mymagicvolume:    external: true

Creo que lo que estás tratando de hacer es más o menos lo mismo que se ve aqui. En resumen: actualmente no es posible crear un volumen con nombre que haga referencia 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 propio volumen y desaparecerán cuando lo elimine.

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

Salida Versión 2 por ejemplo, también 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$