A quoi doit ressembler la syntaxe «volumes» de Docker Compose version 2?

43

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

Ce que j'essaie de faire, c'est de nommer les volumes et d'avoir un chemin d'accès multiple de référence de volume unique sur mon disque hôte local. Voici un exemple, levant une exception avec un Tracebackqui 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'ici, j'ai lu toute la référence de configuration de volume Docker Compose docs- masterbranch , la référence Volume / Pilote de Docker Compose et j'ai consulté des 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é serviceet de le référencer volumes, mais cela ne fonctionne pas aussi bien. Toute idée sur la façon dont cette syntaxe est censée ressembler?

kaiser
la source

Réponses:

40

But de la volumesclé

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

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

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

Avec les 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

La docker-compose.ymlsyntaxe est la suivante:

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 montré volumes nommés.

Comment supprimer des volumes en vrac

Lorsque vous avez un tas de hachages, il peut être assez difficile à nettoyer. Voici un one-liner:

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

Edit: Comme @ArthurTacca l'a souligné dans les commentaires, il existe une méthode plus simple à 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 chercher des hachages, vous pouvez les appeler 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"
    }
]

Note: Vous voudrez peut-être que docker-compose downvos services prennent un nouveau départ avant de créer des volumes.

Si vous utilisez Boot2Docker / Docker Machine , vous devrez docker-machine sshet sudo -iavant de créer un ls -la /mnt/…volume de ce volume - votre ordinateur hôte est la machine virtuelle fournie par Docker Machine .

kaiser
la source
1
très bonne réponse. à votre santé. J'ai beaucoup éclairci en revenant pour trouver de nouveaux volumes de composition de docker.
Derek Adair,
Où les avez-vous trouvé? semble beaucoup plus que le docker docs?
Derek Adair
1
@DerekAdair Merci, mais comme vous pouvez le lire dans les statistiques en haut à gauche, cette réponse est bien référencée dans les pages de résultats du moteur de recherche Google sur ce sujet.
Kaiser
1
Au lieu de $(docker volume ls |awk '{print $2}')vous pouvez utiliser $(docker volume ls -q)Non seulement c'est plus simple, il n'imprime pas "VOLUME" sur la première ligne.
Arthur Tacca
2
Ce n'est pas correct; cela ne fait pas ce que cela donne. volumes_fromconsiste à hériter de la liste des volumes d'un autre conteneur. Pour utiliser un volume nommé, utilisez la syntaxe de niveau de service - NAME:DESTet définissez le chemin dans la volumesclé de niveau supérieur . Au moment de la rédaction de cet exemple, cet exemple crée un volume standard en plus d'un volume nommé, et le volume nommé n'est tout simplement pas utilisé.
Trevorj
13

Si je comprends bien, vous pouvez utiliser la volumes:section globale pour

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

Les volumes de la section globale seront créés automatiquement, à moins d'indication contraire de votre part external: true. Vous devrez toujours indiquer à chaque service de sa 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

L' volumes:entrée globale for projectprovoquera la projectcréation d' un volume nommé . Il est ensuite monté /baren service un, et /fooen 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 indicateurs 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
puzzle
la source
1
Déjà voté, mais aujourd'hui seulement trouvé le temps de contourner et a ajouté une donnée étendue. Merci pour votre aide! Question: Lorsque vous nommez le volume projectpuis que vous le référez project:/bar, où sont les projectchemins réellement définis?
Kaiser
docker-compose les créera automatiquement en tant que volumes nommés sous / var / lib / docker / volumes / nom_volumename
JamesCW
Désolé, je ne comprends toujours pas où le docker obtient un chemin pour un project:alias? Comment docker sait-il si je veux partager, dire ./some_folder/some_subfolder/yet_another_subfolderà la one:et two:conteneurs?
Alexander Lomia
Dans ce cas, il s'agit du "projet: <quel que soit le chemin>" sous les volumes de niveau supérieur: section
Balint Bako le
5

Consultez la version 2, par exemple, ainsi que la référence de configuration de 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
$ 
alexus
la source
1
C'est exactement ce que j'ai lié dans la question et donc ne répond pas à ma question. Souhaitez-vous afficher un exemple montrant comment mapper différents annuaires de l'hôte en tant que volume nommé vers plusieurs services?
Kaiser
mon lien est différent, il pointe sur une Version 2section du document)
alexus
Ma faute. J'ai simplement oublié de lier celui-ci aussi. Lorsque vous examinez le contenu YML dans la question, vous pouvez voir que j'ai clairement essayé de contourner le problème en utilisant la volumesclé de niveau supérieure distincte - ce que je n'ai pas fait, d'où la question. Ce que je ne comprends pas, c'est ce que la docker-compose.ymlpartie avec la syntaxe de la version 1 est censée m'expliquer.
Kaiser
5

Je pense que ce que vous essayez de faire est à peu près le même qu’on le voit ici . En bref: il n'est actuellement pas possible de créer un volume nommé faisant référence à un point de montage sur l'hôte. Vous pouvez créer un volume nommé pour partager des données entre des 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 de docker nommé local-persist .

Ponceuse
la source
3
Monter des volumes nommés est maintenant chose … depuis 1.11 ou 1.12.
Kaiser