Docker Tip #33: Should You Use the Volume or Mount Flag?
For passing in a host's folder into a container both flags do basically the same thing. So which one should you use?
If you’ve played with Docker a bit, you’ve probably seen the
--volume) flag. It comes in very handy for passing in the current directory into a running container.
For example, if you were developing a web application you would want to mount in your source code so that you can see your changes without having to rebuild the Docker image.
Setting up a volume the old way with
docker run ... -v "$(pwd)":/myapp
The left side of the
: is the current directory on the host and the right side of the
: is where it gets mounted into the container.
Setting up the same volume using the mount flag with
docker run ... --mount type=bind,source="$(pwd)",target=/myapp
This does the same thing but it’s more explicit. Without knowing anything else about the command we can see it’s a bind mount that has both a source and a target.
This flag was introduced for non-Swarm based containers in v17.06.
How are they different?
The only difference is, using
-v will create the bound folder on the Docker host if it doesn’t already exist where as using
--mount will throw an error.
I actually like the behavior of
--mount here because chances are when used in the above scenario, you would always expect the folder to exist on the Docker host.
Which one should you use?
Docker recommends using the
--mount flag because it’s more explicit. I would tend to agree but in real world use cases, you’re probably using Docker Compose.
How can you use the new style with Docker Compose?
Compose doesn’t (yet?) have a
mounts property but you can do it with the
volumes: - type: "bind" source: "." target: "/myapp"
With the old way you would have just set
I’m going to start using the explicit style from this day forward in both my own projects as well as my Docker training courses.