Docker: Copying files from Docker container to host

ID : 339

viewed : 158

Tags : dockerdocker-containerfile-copyingdocker





Top 5 Answer for Docker: Copying files from Docker container to host

vote vote

90

In order to copy a file from a container to the host, you can use the command

docker cp <containerId>:/file/path/within/container /host/path/target 

Here's an example:

$ sudo docker cp goofy_roentgen:/out_read.jpg . 

Here goofy_roentgen is the container name I got from the following command:

$ sudo docker ps  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                            NAMES 1b4ad9311e93        bamos/openface      "/bin/bash"         33 minutes ago      Up 33 minutes       0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp   goofy_roentgen 

You can also use (part of) the Container ID. The following command is equivalent to the first

$ sudo docker cp 1b4a:/out_read.jpg . 
vote vote

90

You do not need to use docker run.

You can do it with docker create.

From the docs:

The docker create command creates a writeable container layer over the specified image and prepares it for running the specified command. The container ID is then printed to STDOUT. This is similar to docker run -d except the container is never started.

So, you can do:

docker create -ti --name dummy IMAGE_NAME bash docker cp dummy:/path/to/file /dest/to/file docker rm -f dummy 

Here, you never start the container. That looked beneficial to me.

vote vote

70

Mount a "volume" and copy the artifacts into there:

mkdir artifacts docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS # ... build software here ... cp <artifact> /artifacts # ... copy more artifacts into `/artifacts` ... COMMANDS 

Then when the build finishes and the container is no longer running, it has already copied the artifacts from the build into the artifacts directory on the host.

Edit

Caveat: When you do this, you may run into problems with the user id of the docker user matching the user id of the current running user. That is, the files in /artifacts will be shown as owned by the user with the UID of the user used inside the docker container. A way around this may be to use the calling user's UID:

docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \     ubuntu:14.04 sh << COMMANDS # Since $(id -u) owns /working_dir, you should be okay running commands here # and having them work. Then copy stuff into /working_dir/artifacts . COMMANDS 
vote vote

63

TLDR;

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF chown $(id -u):$(id -g) my-artifact.tar.xz cp -a my-artifact.tar.xz /host-volume EOF 

Description

docker run with a host volume, chown the artifact, cp the artifact to the host volume:

$ docker build -t my-image - <<EOF > FROM busybox > WORKDIR /workdir > RUN touch foo.txt bar.txt qux.txt > EOF Sending build context to Docker daemon  2.048kB Step 1/3 : FROM busybox  ---> 00f017a8c2a6 Step 2/3 : WORKDIR /workdir  ---> Using cache  ---> 36151d97f2c9 Step 3/3 : RUN touch foo.txt bar.txt qux.txt  ---> Running in a657ed4f5cab  ---> 4dd197569e44 Removing intermediate container a657ed4f5cab Successfully built 4dd197569e44  $ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF chown -v $(id -u):$(id -g) *.txt cp -va *.txt /host-volume EOF changed ownership of '/host-volume/bar.txt' to 10335:11111 changed ownership of '/host-volume/qux.txt' to 10335:11111 changed ownership of '/host-volume/foo.txt' to 10335:11111 'bar.txt' -> '/host-volume/bar.txt' 'foo.txt' -> '/host-volume/foo.txt' 'qux.txt' -> '/host-volume/qux.txt'  $ ls -n total 0 -rw-r--r-- 1 10335 11111 0 May  7 18:22 bar.txt -rw-r--r-- 1 10335 11111 0 May  7 18:22 foo.txt -rw-r--r-- 1 10335 11111 0 May  7 18:22 qux.txt 

This trick works because the chown invocation within the heredoc the takes $(id -u):$(id -g) values from outside the running container; i.e., the docker host.

The benefits are:

  • you don't have to docker container run --name or docker container create --name before
  • you don't have to docker container rm after
vote vote

57

Mount a volume, copy the artifacts, adjust owner id and group id:

mkdir artifacts docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS ls -la > /mnt/artifacts/ls.txt echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -g) chown -R $(id -u):$(id -g) /mnt/artifacts COMMANDS 

EDIT: Note that some of the commands like $(id -u) are backslashed and will therefore be processed within the container, while the ones that are not backslashed will be processed by the shell being run in the host machine BEFORE the commands are sent to the container.

Top 3 video Explaining Docker: Copying files from Docker container to host







Related QUESTION?