dockerdocker-composedocker-volume

define volumes in docker-compose.yaml


I am writing a docker-compose.yaml file for my project. I have checked the volumes documentation here .

I also understand the concept of volume in docker that I can mount a volume e.g. -v my-data/:/var/lib/db where my-data/ is a directory on my host machine while /var/lib/db is the path inside database container.

My confuse is with the link I put above. There it has the following sample:

version: "3.9"

services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data

volumes:
  data-volume:

I wonder does it mean that I have to create a directory named data-volume on my host machine? What if I have a directory on my machine with path temp/my-data/ and I want to mount that path to the database container /var/lib/db ? Should I do something like below?

version: "3.9"

services:
  db:
    image: db
    volumes:
      - temp/my-data/:/var/lib/db

volumes:
  temp/my-data/:

My main confusion is the volumes: section at the bottom, I am not sure whether the volume name should be the path of my directory or should be just literally a name I give & if it is the latter case then how could the given name be mapped with temp/my-data/ on my machine? The sample doesn't indicate that & is ambiguous to clarify that.

Could someone please clarify it for me?

P.S. I tried with above docker-compose I guessed, ended up with the error:

ERROR: The Compose file './docker-compose.yaml' is invalid because:
volumes value 'temp/my-data/' does not match any of the regexes: '^[a-zA-Z0-9._-]+$'

Solution

  • Mapped volumes can either be files/directories on the host machine (sometimes called bind mounts in the documentation) or they can be docker volumes that can be managed using docker volume commands.

    The volumes: section in a docker-compose file specify docker volumes, i.e. not files/directories. The first docker-compose in your post uses such a volume.

    If you want to map a file or directory (like in your last docker-compose file), you don't need to specify anything in the volumes: section.

    Docker volumes (the ones specified in the volumes: section or created using docker volume create) are of course also stored somewhere on your host computer, but docker manages that and you shouldn't normally need to know where or what the format is.

    This part of the documentation is pretty good about explaining it, I think https://docs.docker.com/storage/volumes/