web-dev-qa-db-fra.com

À quoi doit ressembler la syntaxe des "volumes" de Docker Compose version 2?

Avec Docker Compose v1.6.0 +, il existe désormais une nouvelle syntaxe de fichier/version 2 pour le docker-compose.yml fichier. Les modifications incluent une clé de niveau supérieur distincte nommée volumes. Cela permet de "centraliser" les définitions de volume en un seul endroit.

Ce que j'essaie de faire est de nommer les volumes là-dedans et avoir un seul chemin de référence de volume multiple sur mon disque hôte local. Voici un exemple, lançant une exception avec un Traceback qui se termine par

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

Exemple 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
  … ?

Jusqu'à présent, j'ai lu toutes les documentation Docker Compose master- branche référence de configuration du volume, la documentation Docker Compose référence Volume/Volume-Driver et regardé à travers - exemples GitHub pour trouver la syntaxe correcte attendue. Il semble que personne ne l'utilise déjà (GitHub) et la documentation est loin d'être complète (docker.com). J'ai également essayé de créer un volume séparé en tant que service et de le référencer dans volumes, mais cela ne fonctionne pas aussi bien. Une idée sur la façon dont cette syntaxe est censée ressembler?

44
kaiser

Objectif de la touche volumes

Il est là pour créer volumes nommés.

Si vous ne l'utilisez pas , vous vous retrouverez avec un tas de valeurs hachées pour vos volumes. Exemple:

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

Avec des volumes nommés, vous obtenez quelque chose comme ceci:

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Comment créer des volumes nommés

Le docker-compose.yml la syntaxe est:

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

Ce quelque chose comme ci-dessus montre les volumes nommés.

Comment supprimer des volumes en masse

Lorsque vous avez un tas de hachages, il peut être assez difficile à nettoyer. Voici une ligne:

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

Edit: Comme @ArthurTacca l'a souligné dans les commentaires, il existe un moyen plus facile à retenir:

docker volume rm $(docker volume ls -q)

Comment obtenir des détails sur un volume nommé

Maintenant que vous n'avez plus besoin de rechercher des hachages, vous pouvez continuer et les appeler par leur… nom:

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"
    }
]

Sidenote: Vous voudrez peut-être docker-compose down vos services pour prendre un nouveau départ avant de créer des volumes.

Si vous utilisez Boot2Docker / Docker Machine , vous devrez docker-machine ssh et Sudo -i avant de faire un ls -la /mnt/… de ce volume - votre machine hôte est la VM provisionnée par Docker Machine .

41
kaiser

D'après ce que je comprends, vous pouvez utiliser le global volumes: section à

  • définir un nom de volume
  • rendre un volume nommé disponible sous un nom de volume différent
  • spécifier un pilote et des options de pilote pour un volume nommé

Les volumes de la section globale seront créés automatiquement, sauf si vous spécifiez external: true. Vous devrez toujours indiquer à chaque service son volumes: section où monter ce volume.

Voici un exemple très simple:

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

Le Global volumes: l'entrée pour project entraînera la création d'un volume nommé project. Il est ensuite monté en tant que /bar en service un et comme /foo en service deux. Les deux services partagent les données du volume et peuvent les lire/écrire.

Je ne pense pas que ce que vous essayez de faire soit possible (transformer plusieurs chemins en un seul volume, et avec différents drapeaux r/w). Si c'est possible, alors probablement en trouvant un moyen de créer un volume nommé avec ces propriétés par d'autres moyens, puis en l'ajoutant en tant que volume externe:

volumes:
  mymagicvolume:
    external: true
13
puzzle

Consultez Version 2 par exemple, également Référence de configuration du volume :

Mon exemple: (Version 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
alexus

Je pense que ce que vous essayez de faire est à peu près le même que vu ici . En bref: il n'est actuellement pas possible de créer un volume nommé qui se réfère à un point de montage sur l'hôte. Vous pouvez créer un volume nommé pour partager des données entre conteneurs, mais les données n'existeront que dans le volume lui-même et disparaîtront lorsque vous supprimerez le volume.

Le montage de volumes nommés a été proposé , mais malheureusement il ne sera pas ajouté au noyau dans un avenir proche. Cependant, cela est possible en utilisant un plugin docker nommé local-persist .

5
Sander