Docker의 기존 명명 된 볼륨에 데이터를 추가하는 올바른 방법은 무엇입니까?


88

볼륨 컨테이너와 함께 예전 방식으로 Docker를 사용했습니다.

docker run -d --name jenkins-data jenkins:tag echo "data-only container for Jenkins"

하지만 이제 명명 된 볼륨을 생성하여 새로운 방식으로 변경했습니다.

 docker volume create --name my-jenkins-volume 

이 새 볼륨을 새 Jenkins 컨테이너에 바인딩했습니다. 내가 남긴 유일한 것은 /var/jenkins_home이전 젠킨스 컨테이너 의 폴더입니다 . (사용하여 docker cp) 이제 새 명명 된 볼륨을 해당 폴더의 내용으로 채우고 싶습니다.

해당 폴더의 내용을 복사 할 수 있습니까 /var/lib/jenkins/volume/my-jenkins-volume/_data?

답변:


134

당신은 할 수 확실히 직접적으로 데이터를 복사 /var/lib/docker/volumes/my-jenkins-volume/_data하지만, 이렇게함으로써 당신은 다음과 같습니다 :

  • Docker 호스트에 대한 물리적 액세스에 의존합니다. 이 기술은 원격 Docker API와 상호 작용하는 경우 작동하지 않습니다.

  • 볼륨 구현의 특정 측면에 의존하면 향후 변경 될 수 있으며 이에 의존하는 프로세스가 중단 될 수 있습니다.

명령 줄 클라이언트를 통해 도커 API를 사용하여 수행 할 수있는 작업에 의존하는 것이 더 낫다고 생각합니다. 가장 쉬운 해결책은 아마도 다음과 같은 도우미 컨테이너를 사용하는 것입니다.

docker run -v my-jenkins-volume:/data --name helper busybox true
docker cp . helper:/data
docker rm helper

3
두 번째 총알과 관련하여 docker volume inspect my-jenkins-volume --format '{{.Mountpoint}}'프로그래밍 방식으로 실제 위치를 얻기 위해 실행할 수 있습니다 . 그래도 좋은 생각이 아닌 것 같습니다.
c24w

8
이 도우미 컨테이너는 실제로 실행할 필요가 없습니다. 단순히 생성 한 다음 실행 docker cp한 다음 제거하는 것으로 충분 합니다.
Alex는

결과를 보거나 파일을 수동으로 수정하기 위해 해당 컨테이너로 실행할 수 없습니다.
CodeOrElse

3
파일이 xhyve 가상 머신 내부에 저장되기 때문에 Mac 용 Docker를/var/lib/docker/volumes/my-jenkins-volume/_data 사용할 때 목록 이 작동하지 않습니다 . forums.docker.com/t/var-lib-docker-does-not-exist-on-host/18314 참조
Ortomala Lokni

1
사실인가요 여기에 설명 stackoverflow.com/questions/29762231/...
Zuabi

32

예를 들어 다음을 사용하여 허용되는 답변을 한 줄로 줄일 수 있습니다.

docker run --rm -v `pwd`:/src -v my-jenkins-volume:/data busybox cp -r /src /data

1
/ tmp의 일시적인 특성으로 인해 컨테이너가 cp가 완료되기 전에 데이터를 삭제할 수있는 위험이 있는지 궁금하십니까? pathname.com/fhs/pub/fhs-2.3.html#TMPTEMPORARYFILES
thurt

1
링크는 / tmp에있는 파일의 수명을 실제로 명확히하지 않습니다. "프로그램은 / tmp에있는 파일이나 디렉토리가 프로그램 호출 사이에 보존된다고 가정해서는 안됩니다." 파일이 살아남을 것이라는 것을 의미하지만 그것은 보장입니다. docker의 -v 옵션은 존재하지 않는 경우 컨테이너에 디렉토리를 생성하므로이 잠재적 경쟁 조건이 걱정되는 경우 / tmp / src를 / src로 변경하면 작동합니다. 단점이 없기 때문에 이것을 반영하기 위해 대답을 편집 할 것입니다.
headdab

3
-v `pwd`:/src명령이 호스트에서 실행되고 있음을 의미 하지 않습니까? ( pwd예를 들어, 호스트 가 다른 시스템 인 경우 어떻게 호스트를 매핑 할 수 있습니까?-할 수 없습니다.) docker 명령이 호스트에서 실행되지 않으면 작동하지 않습니다. 이것이 우리가 docker cp를 사용하는 이유라고 생각합니다. 이것은 docker의 "방법"이 아닌 것처럼 보입니다. 호스트에서 docker 명령이 실행될 때만 작동하는 특별한 경우입니다. 내가 올바르게 이해 했습니까?
Wyck

네, 당신이 옳다고 생각합니다. pwd호스트 시스템의 파일로 해석되어야합니다. docker의 마운트 문서에서 : "바인드 마운트의 경우 첫 번째 필드는 호스트 시스템의 파일 또는 디렉토리에 대한 경로입니다."
headdab

1
따라서,이 복사 작동하지 않는 당신의 용기에 로컬 파일을 경우 당신이 장착 될 때, 원격 호스트에 pwd심지어 원격 호스트에 존재할 필요하지 않는. 대신 Dmytro Melnychuk (create + cp + rm)의 솔루션은 실행중인 위치에 관계없이 로컬 컨테이너를 컨테이너에 복사합니다.
Xavi Montero

25

이미 존재하는 명명 된 볼륨에 데이터를 추가하기 위해 일부 컨테이너를 시작할 필요가 없습니다. 컨테이너를 만들고 여기에 데이터를 복사하기 만하면됩니다.

docker container create --name temp -v my-jenkins-volume:/data busybox
docker cp . temp:/data
docker rm temp

2
busybox의 내용이 실제로 필요하지 않은 경우 당신은 이것을 할 수 hello-world있고 또한 작동합니다. busybox1.22MB입니다. 대신 hello-world13.3kB입니다. 질문은 다음과 같습니다. Dockerfile을 스크래치에서 수행 할 수있는 것과 같은 방법으로 볼륨을 "마운트"하고 컨테이너를 시작하지 않기를 원하므로 이미지로 "아무것도"가없는 "도커 컨테이너 생성"을 수행 할 수 있습니까?
Xavi Montero

1
이 솔루션에 대한 +1은 가장 많이 투표되었지만 올바른 구문 docker cpdocker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
Marco Dufal

3

~ / data의 내용을 my-vol 이라는 도커 볼륨 에 복사하는 단계는 다음과 같습니다.

단계 1. 볼륨을 "임시"컨테이너에 연결합니다. 터미널에서 실행하려면 다음 명령을 사용하십시오.

docker run --rm -it --name alpine --mount type=volume,source=my-vol,target=/data alpine

2 단계. ~ / data의 내용 을 my-vol에 복사합니다 . 이를 위해 새 터미널 창에서 다음 명령을 실행하십시오.

cd ~/data docker cp . alpine:/data

~ / data의 내용 을 my-vol 볼륨에 복사합니다 . 복사 후 임시 컨테이너를 종료하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.