[docker] Docker-이미지에서 호스트로 파일을 복사하려면 어떻게해야합니까?

내 질문은 컨테이너에서 호스트로 파일을 복사하는 것과 관련 있습니다. 종속성을 가져오고 소스에서 빌드 아티팩트를 컴파일하고 실행 파일을 실행하는 Dockerfile이 있습니다. 나는 또한이있어 내 경우에는 (빌드 유물을 복사 할 .zip생산 sbt dist../ 대상 /`,하지만이 문제는 또한 적용 생각에 항아리, 바이너리 등 ‘에

docker cp이미지가 아닌 컨테이너에서 작동합니다. 컨테이너에서 파일을 가져 오기 위해 컨테이너를 시작해야합니까? 스크립트에서 나는 /bin/bash백그라운드에서 대화 형 모드로 실행 하고 파일을 복사 한 다음 컨테이너를 죽이려고 시도했지만 이것은 kludgey처럼 보입니다. 더 좋은 방법이 있습니까?

다른 한편으로, 나는 단지 하나의 파일을 꺼내기 위해 .tar실행 한 후에 파일의 압축을 푸는 것을 피하고 싶습니다 docker save $IMAGENAME(하지만 지금은 가장 간단한 옵션 인 것처럼 보입니다).

도커 볼륨을 사용합니다. 예 :

docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out

하지만 boot2dockerOSX에서 실행 중이고 내 mac 호스트 파일 시스템에 직접 쓰는 방법을 모르겠습니다 (읽기-쓰기 볼륨이 내 boot2docker VM 내부에 마운트되어 있으므로 blah.zip이미지에서 추출 할 스크립트를 쉽게 공유 할 수 없습니다. 기타. 생각?



답변

이미지에서 파일을 복사하려면 임시 컨테이너를 만들고 여기에서 파일을 복사 한 다음 삭제합니다.

id=$(docker create image-name)
docker cp $id:path - > local-tar-file
docker rm -v $id


답변

불행히도 Docker 이미지에서 직접 파일을 복사하는 방법은없는 것 같습니다. 먼저 컨테이너를 만든 다음 컨테이너에서 파일을 복사해야합니다.

그러나 이미지에 cat명령이 포함 된 경우 (많은 경우에 해당) 단일 명령으로 수행 할 수 있습니다.

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

이미지에이 포함되어 있지 않으면 cat컨테이너를 만들고 docker cpIgor의 대답에 제안 된대로 명령을 사용하십시오 .


답변

훨씬 빠른 옵션은 실행중인 컨테이너에서 마운트 된 볼륨으로 파일을 복사하는 것입니다.

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

실제 0m0.446s

** VS **

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

실제 0m9.014s


답변

부모 의견은 이미 cat 사용 방법을 보여주었습니다 . 비슷한 방식으로 tar 를 사용할 수도 있습니다 .

docker run yourimage tar -c -C /my/directory subfolder | tar x


답변

docker cp $(docker create registry.example.com/ansible-base:latest):/home/ansible/.ssh/id_rsa ./hacked_ssh_key

한 줄 솔루션을 제공하고자

편집 : 컨테이너가이 솔루션에서 실행될 필요도 없습니다.


답변

이 문제에 대한 또 다른 (짧은) 대답 :

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


답변

MacOS에서 boot2docker를 사용하고 있습니다. “docker cp”를 기반으로 한 스크립트는 이식 가능하다는 것을 확신 할 수 있습니다. 모든 명령은 boot2docker 내부에서 릴레이되지만 바이너리 스트림은 Mac에서 실행되는 도커 명령 줄 클라이언트로 다시 릴레이되기 때문입니다. 따라서 도커 클라이언트의 쓰기 작업은 서버 내에서 실행되고 실행중인 클라이언트 인스턴스에 다시 기록됩니다!

내가 제공하는 모든 도커 컨테이너와 도커 볼륨에 대한 백업 스크립트를 공유하고 있으며 내 백업 스크립트는 boot2docker를 사용하여 Linux 및 MacOS에서 모두 테스트됩니다. 백업은 플랫폼간에 쉽게 교환 할 수 있습니다. 기본적으로 스크립트 내에서 다음 명령을 실행하고 있습니다.

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

새 busybox 컨테이너를 실행하고 jenkins_jenkins_1이라는 이름으로 내 jenkins 컨테이너의 볼륨을 마운트합니다. 전체 볼륨이 backups / JenkinsBackup-2015-07-09-14-26-15.tar 파일에 기록됩니다.

백업 또는 복원 스크립트를 조정하지 않고 Linux 컨테이너와 Mac 컨테이너간에 아카이브를 이미 이동했습니다. 이것이 당신이 원하는 것이라면 여기에서 전체 스크립트를 찾을 수 있습니다 : blacklabelops / jenkins