dockermount-pointvolumes

What's the difference between "docker run -v ..." volume and Dockerfile VOLUME?


I have successfully been able to share folders between a docker container with volumes using

docker run -v /host/path:/container/path ...

But my question is what the difference between this and using the VOLUME command in the Dockerfile

VOLUME /path

I am using an image that has a VOLUME command, and I'd like to know how to share it with my host. I have done it using the -v command above, but I didn't know if I needed both the -v and VOLUME.


Solution

  • The VOLUME command will mount a directory inside your container and store any files created or edited inside that directory on your hosts disk outside the container file structure, bypassing the union file system.

    The idea is that your volumes can be shared between your docker containers and they will stay around as long as there's a container (running or stopped) that references them.

    You can have other containers mount existing volumes (effectively sharing them between containers) by using the --volumes-from command when you run a container.

    The fundamental difference between VOLUME and -v is this: -v will mount existing files from your operating system inside your docker container and VOLUME will create a new, empty volume on your host and mount it inside your container.

    Example:

    1. You have a Dockerfile that defines a VOLUME /var/lib/mysql.
    2. You build the docker image and tag it some-volume
    3. You run the container

    And then,

    1. You have another docker image that you want to use this volume
    2. You run the docker container with the following: docker run --volumes-from some-volume docker-image-name:tag
    3. Now you have a docker container running that will have the volume from some-volume mounted in /var/lib/mysql

    Note: Using --volumes-from will mount the volume over whatever exists in the location of the volume. I.e., if you had stuff in /var/lib/mysql, it will be replaced with the contents of the volume.