45 votes

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

Avec Docker Compose v1.6.0+, il y a maintenant une nouvelle syntaxe de fichier (version 2) pour le fichier docker-compose.yml fichier. Les changements incluent une clé de premier niveau distincte nommée volumes . Cela permet de "centraliser" les définitions de volume en un seul endroit.

Ce que j'essaie de faire, c'est nom et avoir un seul volume référençant plusieurs chemins d'accès sur mon disque hôte local. Ce qui suit est un exemple, lançant une exception avec une erreur de type 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 tous les Docker Compose docs master -Branche Référence pour la configuration du volume, le Docker Compose docs Référence du volume/du pilote de volume et examen de la référence du volume/du pilote de volume. Exemples sur 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 construire un volume séparé en tant que service et 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 se présenter ?

42voto

Dingo Points 11

Objectif de la volumes clé

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

Si vous le faites no l'utiliser, 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 les volumes nommés, vous obtenez quelque chose comme ce qui suit :

$ docker volume ls
local               projectname_someconf
local               projectname_otherconf

Comment créer des volumes nommés

En docker-compose.yml est la syntaxe :

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

Cela ressemble aux volumes nommés présentés ci-dessus.

Comment enlever des volumes en vrac

Lorsque vous avez un tas de hachages, il peut être difficile de les nettoyer. Voici un exemple :

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

Edita: Comme l'a souligné @ArthurTacca dans les commentaires, il existe une méthode plus facile à retenir :

docker volume rm $(docker volume ls -q)

Comment obtenir des informations sur un volume nommé

Maintenant que vous n'avez plus besoin de chercher les hashs, vous pouvez aller sur le site 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 pourriez vouloir docker-compose down vos services pour prendre un nouveau départ avant d'aller créer des volumes.

Si vous utilisez Boot2Docker / Machine Docker Vous devrez docker-machine ssh y sudo -i avant d'effectuer une ls -la /mnt/… de ce volume - votre machine hôte est la VM provisionnée par le système d'information. Machine Docker .

EDIT : Autre réponse relative aux volumes nommés sur SO .

14voto

puzzle Points 251

D'après ce que j'ai compris, vous pouvez utiliser la fonction globale 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 à moins que vous ne spécifiiez external: true . Vous devrez toujours indiquer à chaque service dans son volumes: où monter ce volume.

Voici un exemple très simple :

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

Le programme mondial volumes: entrée pour project provoquera l'apparition d'un volume nommé project à créer. Il est ensuite monté en tant que /bar dans le premier service, et en tant que /foo dans le 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 des drapeaux r/w différents). Si c'est possible, alors probablement en trouvant un moyen de créer un volume nommé avec ces propriétés par un autre moyen, puis en l'ajoutant en tant que volume externe :

volumes:
  mymagicvolume:
    external: true

5voto

alexus Points 12076

Vérifier Version 2 par exemple, également Référence pour la 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
$

5voto

Christian Points 1200

Je pense que ce que vous essayez de faire est à peu près identique à ce qui a été vu 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, il est possible d'utiliser un plugin docker nommé local-persistant .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X