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?
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
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.
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)
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 .
D'après ce que je comprends, vous pouvez utiliser le global volumes:
section à
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
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
$
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 .