With Docker Compose v1.6.0+, there now is a new/version 2 file syntax for the docker-compose.yml
file. The changes include a separate top level key named volumes
. This allows to "centralize" volume definitions in one place.
What I am trying to do is to name volumes in there and have a single volume reference multiple path on my local host disk. The following is an example, throwing an exception with a Traceback
that ends with
AttributeError: 'list' object has no attribute 'items'
Example 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
… ?
So far I read through all the Docker Compose docs master
-branch Volume configuration reference, the Docker Compose docs Volume/Volume-Driver reference and looked through GitHub examples to find the correct syntax that is expected. It seems no one is already using that (GitHub) and the documentation is far from being complete (docker.com). I also tried to build a separate volume as service
and reference it in volumes
, but that does not work as well. Any idea on how to this syntax is supposed to look like?
Best Answer
Purpose of the
volumes
keyIt is there to create named volumes.
If you do not use it, then you will find yourself with a bunch of hashed values for your volumes. Example:
With named volumes, you get something like the following:
How to create named volumes
The
docker-compose.yml
syntax is:This something like above shown named volumes.
How to remove volumes in bulk
When you have a bunch of hashes, it can be quite hard to clean up. Here's a one-liner:
Edit: As @ArthurTacca pointed out in the comments, there's an easier to remember way:
How to get details about a named volume
Now that you do not have to look up hashes anymore, you can go on it and call them by their … name:
Sidenote: You might want to
docker-compose down
your services to get a fresh start before going to create volumes.In case you are using Boot2Docker/ Docker Machine, you will have to
docker-machine ssh
andsudo -i
before doing als -la /mnt/…
of that volume – you host machine is the VM provisioned by Docker Machine.EDIT: Another related answer about named volumes on SO.