NotGaeL
NotGaeL

Reputation: 8484

What happens when a volume links an existing populated host and container dir

I've searched the docs but nothing came up so time to test it. But for a quick future reference...

Is the host folder populated with the container folder contents?

Is it the opposite?

Are both folder contents merged? (In that case: What happens when a file with the same name is in both folders?)

Or does it produce an error? Is the error thrown on launch or is it thrown when you try to build an image with a VOLUME pointing to an existing populated folder on the container?

Also, another thing that isn't in the docs: Do I have to define the container path as a VOLUME in the Dockerfile in order to use -v against it when launching the container or can I create volumes on the fly?

Upvotes: 35

Views: 19955

Answers (2)

Elton Stoneman
Elton Stoneman

Reputation: 19174

When you run a container and mount a volume from the host, all you see in the container is what is on the host - the volume mount points at the host directory, so if there was anything in the directory in the image it gets bypassed.

With an image from this Dockerfile:

FROM ubuntu
WORKDIR /vol
RUN touch /vol/from-container
VOLUME /vol

When you run it without a host mount, the image contents get copied into the volume:

> docker run vol-test ls /vol
from-container 

But mount the volume from the host and you only see the host's content:

> ls $(pwd)/host
from-host
> docker run -v $(pwd)/host:/vol vol-test ls /vol
from-host

And no, you don't need the VOLUME instruction. The behaviour is the same without it.

Upvotes: 43

jwodder
jwodder

Reputation: 57520

Whenever a Docker container is created with a volume mounted on the host, e.g.:

docker run -v /path/on/host:/data container-image

Any contents that are already in /data due to the image build process are always completely discarded, and whatever is currently at /path/on/host is used in its place. (If /path/on/host does not exist, it is created as an empty directory, though I think some aspect of that behavior may currently be deprecated.)

Pre-defining a volume in the Dockerfile with VOLUME is not necessary; all VOLUME does is cause any containers run from the image to have an implicit -v /volume/path (Note lack of host mount path) argument added to their docker run command which is ignored if an explicit -v /host/path:/volume/path is used.

Upvotes: 10

Related Questions