Search code examples
dockerdockerfilevolumes

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?


Solution

  • 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.