Pregunta ¿Cómo se ve la sintaxis de "volúmenes" de Docker Compose versión 2?


Con Docker componer v1.6.0 +, ahora hay una nueva sintaxis de archivos / versión 2 para docker-compose.yml expediente. Los cambios incluyen una clave separada de nivel superior llamada 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 una única ruta de referencia múltiple de volumen 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/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 he leído todo el Docker componer documentos master-rama Referencia de configuración de volumen, la Docker componer documentos Volumen / Volumen de referencia del controlador y miró a través Ejemplos de GitHub para encontrar la sintaxis correcta que se espera. Parece que nadie lo está utilizando (GitHub) y la documentación está lejos de estar completa (docker.com). También traté de construir un volumen separado como service y la referencia en volumes, pero eso no funciona tan bien. ¿Alguna idea de cómo se debe ver esta sintaxis?


41
2018-03-02 15:16


origen




Respuestas:


Propósito de la volumes llave

Está ahí para crear volúmenes nombrados.

Si lo haces no úselo, luego 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 nombrados, obtienes algo como lo siguiente:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Cómo crear volúmenes con nombre

los 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/conf

volumes:
    appconf:

networks:
    front:
        driver: bridge

Este algo así como los volúmenes mencionados anteriormente se muestran.

Cómo eliminar volúmenes a granel

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 forma más fácil de recordar:

docker volume rm $(docker volume ls -q)

Cómo obtener detalles sobre un volumen nombrado

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: Tu podrías querer docker-compose down Sus servicios para obtener un nuevo comienzo antes de ir a crear volúmenes.

En caso de que estés usando Boot2Docker/ Docker Machine, tendras 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 Docker Machine.


40
2018-04-09 14:20



Muy buena respuesta. aclamaciones. Se aclaró mucho volviendo a encontrar nuevos volúmenes de composición de docker. - Derek Adair
¿Dónde encontraste esto? Parece mucho más que los documentos de docker? - Derek Adair
@DerekAdair Gracias, pero como puede leer en las estadísticas en la parte superior izquierda, esta respuesta está bien referenciada en las páginas de resultados del motor de búsqueda de Google sobre este tema. - kaiser
En lugar de $(docker volume ls |awk '{print $2}') puedes usar $(docker volume ls -q) Esto no solo es más simple, sino que no imprime "VOLUMEN" en la primera línea. - Arthur Tacca
Esto no es correcto; Esto no hace lo que parece que hace. volumes_from Es para heredar La lista de volúmenes de otro contenedor. Para usar un volumen con nombre, usa la sintaxis de nivel de servicio - NAME:DEST, y establecer el camino en el nivel superior volumes llave. Lo que hace este ejemplo (en el momento de escribir esto) es hacer un volumen estándar en adición a un volumen con nombre, y el volumen con nombre simplemente no se utiliza. - trevorj


Como yo lo entiendo, puedes usar el global. volumes: sección a

  • definir un nombre de volumen
  • hacer un volumen con nombre disponible bajo un nombre de volumen diferente
  • Especifique un controlador y las opciones de controlador para un volumen con nombre

Los volúmenes en la sección global se crearán automáticamente a menos que especifique external: true. Aún deberá indicar cada servicio en su volumes: Sección donde montar ese volumen.

Aquí hay un ejemplo muy simple:

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

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

No creo que lo que está intentando hacer sea posible (convertir varias rutas en un solo volumen y con diferentes indicadores de r / w). Si es posible, luego, probablemente al encontrar una forma 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

13
2018-04-02 21:56



Ya se ha votado, pero hasta hoy encontramos tiempo para sortearlo y se agregaron datos ampliados. ¡Gracias por toda tu ayuda! Pregunta: A medida que nombras el volumen project y luego referenciarlo como project:/bar, dónde están project caminos realmente definidos? - kaiser
docker-compose los creará automáticamente como volúmenes con nombre en / var / lib / docker / volume / volumename - JamesCW
Lo siento, todavía no entiendo de dónde obtiene la ventana acoplable un camino para project: ¿alias? ¿Cómo sabe la ventana acoplable si quiero compartir? ./some_folder/some_subfolder/yet_another_subfolder al one: y two: contenedores? - Alexander Lomia
En ese caso, es "project: <whateverpath>" en la sección de volúmenes de nivel superior: - Balint Bako


Revisa 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
$ 

5
2018-03-02 21:48



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 Version 2 sección del documento) - alexus
Mi error. Simplemente me olvidé de vincular ese también. Cuando miras las cosas YML en la pregunta, puedes ver que claramente traté de moverme usando el nivel superior separado. volumesllave - que no lo hice, de ahí la pregunta. Lo que no entiendo es lo que docker-compose.yml parte con la sintaxis de la versión 1 está destinada a explicarme. - kaiser


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 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 elimine el volumen.

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


5
2018-06-15 12:20



Montaje de volúmenes nombrados  ahora es una cosa ... desde 1.11 o 1.12. - kaiser
Parecería que sí, sí. ¡Gracias! - Sander