Docker - how can I copy a file from an image to a host?

前端 未结 8 682
庸人自扰
庸人自扰 2020-12-02 05:56

My question is related to this question on copying files from containers to hosts; I have a Dockerfile that fetches dependencies, compiles a build artifact from source, and

相关标签:
8条回答
  • 2020-12-02 06:39

    Parent comment already showed how to use cat. You could also use tar in a similar fashion:

    docker run yourimage tar -c -C /my/directory subfolder | tar x
    
    0 讨论(0)
  • 2020-12-02 06:43

    Unfortunately there doesn't seem to be a way to copy files directly from Docker images. You need to create a container first and then copy the file from the container.

    However, if your image contains a cat command (and it will do in many cases), you can do it with a single command:

    docker run --rm --entrypoint cat yourimage  /path/to/file > path/to/destination
    

    If your image doesn't contain cat, simply create a container and use the docker cp command as suggested in Igor's answer.

    0 讨论(0)
  • 2020-12-02 06:45

    A much faster option is to copy the file from running container to a mounted volume:

    docker run -v $PWD:/opt/mount --rm --entrypoint cp image:version /data/libraries.tgz /opt/mount/libraries.tgz
    

    real 0m0.446s

    ** VS **

    docker run --rm --entrypoint cat image:version /data/libraries.tgz > libraries.tgz
    

    real 0m9.014s

    0 讨论(0)
  • 2020-12-02 06:50

    I am using boot2docker on MacOS. I can assure you that scripts based on "docker cp" are portable. Because any command is relayed inside boot2docker but then the binary stream is relayed back to the docker command line client running on your mac. So write operations from the docker client are executed inside the server and written back to the executing client instance!

    I am sharing a backup script for docker volumes with any docker container I provide and my backup scripts are tested both on linux and MacOS with boot2docker. The backups can be easily exchanged between platforms. Basically I am executing the following command inside my script:

    docker run --name=bckp_for_volume --rm --volumes-from jenkins_jenkins_1 -v /Users/github/jenkins/backups:/backup busybox tar cf /backup/JenkinsBackup-2015-07-09-14-26-15.tar /jenkins
    

    Runs a new busybox container and mounts the volume of my jenkins container with the name jenkins_jenkins_1. The whole volume is written to the file backups/JenkinsBackup-2015-07-09-14-26-15.tar

    I have already moved archives between the linux container and my mac container without any adjustments to the backup or restore script. If this is what you want you find the whole script an tutorial here: blacklabelops/jenkins

    0 讨论(0)
  • 2020-12-02 06:53

    Another (short) answer to this problem:

    docker run -v $PWD:/opt/mount --rm -ti image:version bash -c "cp /source/file /opt/mount/"
    

    Update - as noted by @Elytscha Smith this only works if your image has bash built in

    0 讨论(0)
  • 2020-12-02 06:54

    To copy a file from an image, create a temporary container, copy the file from it and then delete it:

    id=$(docker create image-name)
    docker cp $id:path - > local-tar-file
    docker rm -v $id
    
    0 讨论(0)
提交回复
热议问题