Mounting directory from host machine to container in Docker

DotcloudDocker

Dotcloud Problem Overview


How do I mount a directory from the host machine to a container in Docker?

Dotcloud Solutions


Solution 1 - Dotcloud

Just as a final update, this feature is now released in Docker (though the API has changed since the pull request linked by @imiric).

Simply use a command like

docker run -v /tmp:/root myImage

in order to mount /tmp from the host machine as /root within the image.

Source: https://docs.docker.com/engine/userguide/dockervolumes/

Solution 2 - Dotcloud

***Update - see answer below. this is no longer the correct answer ***

You can't mount them, by design, because Docker could no longer guarantee a repeatable execution environment.

However you can:

  1. Import the host's root filesystem and create a new image from it:

     tar -C / -c . | docker import - entend/custombase
    
  2. Import a bootstrap root filesystem, for example the result of running 'debootstrap'. (Note that this is how the official "base" image was created, so you might be better off simply running 'docker pull base')

     debootstrap precise ./bootstrap
     tar -C ./bootstrap -c . | docker import - entend/ubuntubase
    
  3. Inject the contents of a local directory into a container when running it.

     IMAGE=base; SRC=./stuff; DST=/tmp/stuff; CMD="echo hello world"; tar -C $src -c . | docker run $IMAGE -i /bin/sh -c "tar -C $DST -x; $CMD"
    

    This will run a container from $IMAGE, copy host directory $SRC into container directory $DST, then run command $CMD.

    This last example is typically used to insert source code before running a build command inside the container.

Solution 3 - Dotcloud

Just to update this question, this will soon be possible in Docker.

This pull request has actually implemented this feature and will be soon merged to master.

You can use it right now if you install this fork.

Solution 4 - Dotcloud

This IS possible in Docker:

Mount data into application container:

docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash

Solution 5 - Dotcloud

Trick for OS X and Windows

Two successive mounts: I guess many posts here might be using two boot2docker's. The reason you don't see anything is because you are mounting a directory from boot2docker, not from your host. You basically need two successive mounts: the first one to mount a directory from your host to your system and the second to mount the new directory from boot2docker to your container like this:

  1. Mount local system on boot2docker:

     sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  2. Mount boot2docker file on a Linux container

     docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Then when you do ls inside containerfolder you will see the content of your hostfolder

Solution 6 - Dotcloud

Update July 2021

Dockerfile solution

Add the following line in your Dockerfile which copies the data from your host machine to the created image (container).

# Other lines of Dockerfile
COPY <relative-or-absolute-path-of-the-directory-in-host-machine> <relative-or-absolute-path-of-the-directory-in-container>
# Example:
# COPY ./redis/data/:/db_data

P.S.: Container is a running image.

Docker-compose solution

Volumes can be defined in various ways in docker-compose file. One of them is to mount the directory address of your host machine to the container. (like what we have in the dockerfile solution) as one part of your service:

volumes:
    - <relative-or-absolute-path-of-the-directory-in-host-machine>:<relative-or-absolute-path-of-the-directory-in-container>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPavel NuzhdinView Question on Stackoverflow
Solution 1 - Dotclouduser2089674View Answer on Stackoverflow
Solution 2 - DotcloudSolomon HykesView Answer on Stackoverflow
Solution 3 - DotcloudimiricView Answer on Stackoverflow
Solution 4 - DotcloudJoost van der LaanView Answer on Stackoverflow
Solution 5 - DotcloudlouisdView Answer on Stackoverflow
Solution 6 - DotcloudMostafa GhadimiView Answer on Stackoverflow