질문자 :user3001829
우리가 작업하는 Docker 컨테이너에 대한 백업 및 복원 솔루션을 구축하려고 합니다.
내가 만든 Docker 기본 이미지인 ubuntu:base
가 있으며 Docker 파일을 사용하여 파일을 추가하기 위해 매번 다시 빌드할 필요가 없습니다.
호스트 시스템에서 실행되고 ubuntu:base
Docker 이미지를 사용하여 새 컨테이너를 만든 다음 파일을 해당 컨테이너에 복사하는 스크립트를 만들고 싶습니다.
호스트에서 컨테이너로 파일을 복사하려면 어떻게 해야 합니까?
cp
명령을 사용하여 파일을 복사할 수 있습니다.
하나의 특정 파일을 다음과 같이 컨테이너에 복사할 수 있습니다.
docker cp foo.txt container_id:/foo.txt
다음과 같이 컨테이너에서 하나의 특정 파일을 복사할 수 있습니다.
docker cp container_id:/foo.txt foo.txt
강조를 위해 container_id
는 이미지 ID가 아닌 컨테이너 ID입니다. container_id
가 포함된 목록을 보려면 docker ps
를 사용하십시오.)
src
폴더에 포함된 여러 파일은 다음을 사용하여 target
폴더에 복사할 수 있습니다.
docker cp src/. container_id:/target docker cp container_id:/src/. target
참조: cp
용 Docker CLI 문서
Docker 1.8 이전 버전에서는 컨테이너에서 호스트로만 파일을 복사할 수 있었습니다. 호스트에서 컨테이너로가 아닙니다.
0x7d7b컨테이너 이름 또는 짧은 컨테이너 ID 가져오기:
$ docker ps
전체 컨테이너 ID 가져오기:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
파일 복사:
$ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
예시:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8e703d7e303 solidleon/ssh:latest /usr/sbin/sshd -D cranky_pare $ docker inspect -f '{{.Id}}' cranky_pare
또는
$ docker inspect -f '{{.Id}}' d8e703d7e303 d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5 $ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
solidleon가장 깔끔한 방법은 컨테이너를 시작할 때 컨테이너에 호스트 디렉토리를 마운트하는 것입니다.
{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image {host} docker exec -it my_container bash {container} cp /mnt/sourcefile /path/to/destfile
Ben Davis다음은 꽤 추악한 방법이지만 작동합니다.
docker run -i ubuntu /bin/bash -c 'cat > file' < file
Erik일반적으로 세 가지 유형이 있습니다.
컨테이너에서 호스트로
docker cp container_id:./bar/foo.txt .
호스트에서 컨테이너로
docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
호스트에서 컨테이너로 복사하는 두 번째 접근 방식:
docker cp foo.txt mycontainer:/foo.txt
용기에서 용기로 믹스 1과 2
docker cp container_id1:./bar/foo.txt . docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
Ali Hallaji실행 중인 컨테이너에서 이 작업을 수행해야 하는 경우 docker exec(1.3에 추가됨)을 사용할 수 있습니다.
먼저 컨테이너의 이름 또는 ID를 찾습니다.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9b7400ddd8f ubuntu:latest "/bin/bash" 2 seconds ago Up 2 seconds elated_hodgkin
위의 예에서 우리는 b9b7400ddd8f
또는 elated_hodgkin
사용할 수 있습니다.
호스트의 /tmp/somefiles
/var/www
에 복사하려면 다음을 수행하십시오.
$ cd /tmp/somefiles $ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www
그런 다음 /bin/bash
를 실행하고 작동하는지 확인할 수 있습니다.
$ docker exec -it elated_hodgkin /bin/bash root@b9b7400ddd8f:/# ls /var/www file1 file2
adean새 dockerfile을 만들고 기존 이미지를 기반으로 사용합니다.
FROM myName/myImage:latest ADD myFile.py bin/myFile.py
그런 다음 컨테이너를 빌드합니다.
docker build .
RustyShackleford솔루션은 아래와 같습니다.
Docker 셸에서
root@123abc:/root# <-- get the container ID
호스트로부터
cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root
파일은 파일 시스템에서 컨테이너가 있는 위치에 직접 복사됩니다.
pierce실행 중인 컨테이너에 파일을 복사하는 또 다른 솔루션은 tar를 사용하는 것입니다.
tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x
foo.sh
파일을 컨테이너의 /tmp
편집: Maarten 의 의견 덕분에 -f
joemat호스트에서 실행 중인 컨테이너 로 파일을 복사하려면
docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH
Erik의 답변 과 Mikl 및 z0r의 의견을 기반으로 합니다.
Andrea제목의 이 질문에서 제기된 '호스트에서 Docker 컨테이너로 파일 복사' 질문에 대한 직접적인 답변입니다.
docker cp
시도하십시오. 가장 쉬운 방법이며 내 Mac에서도 작동합니다. 용법:
docker cp /root/some-file.txt some-docker-container:/root
이 파일을 복사합니다 some-file.txt
디렉토리에 /root
라는 이름의 부두 노동자의 용기에 호스트 컴퓨터에서 some-docker-container
디렉토리에 /root
. 보안 복사 구문에 매우 가깝습니다. 그리고 이전 포스트에서 보았듯이 그 반대의 경우에도 사용할 수 있습니다. 즉, 컨테이너에서 호스트로 파일도 복사합니다.
그리고 이 게시물을 다운링크하기 전에 docker cp --help
를 입력하십시오. 문서를 읽는 것은 때때로 매우 도움이 될 수 있습니다.
그런 방식이 마음에 들지 않고 이미 생성되어 실행 중인 컨테이너의 데이터 볼륨을 원하는 경우 현재 재생산이 유일한 옵션입니다. 기존 Docker 컨테이너에 볼륨을 추가하려면 어떻게 해야 합니까? 도 참조하십시오. .
Hiro.Protagonist여기에서 대부분의 (추천된) 솔루션을 시도했지만 docker 17.09(2018년)에는 더 이상 /var/lib/docker/aufs 폴더가 없습니다.
이 간단한 docker cp
가 이 작업을 해결했습니다.
docker cp c:\path\to\local\file container_name:/path/to/target/dir/
container_name을 얻는 방법?
docker ps
NAMES
섹션이 있습니다. IMAGE
사용하지 마십시오.
Aerinjoemat컨테이너와 로컬 파일 시스템 간에 파일/폴더를 복사하려면 다음 명령을 입력합니다.
docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}
예를 들어,
docker cp /home/foo container-id:/home/dir
컨테이너 ID를 얻으려면 주어진 명령을 입력하십시오:
docker ps
위 내용은 docker.com에서 가져왔습니다 .
prayagupd컨테이너가 이미 실행 중이라고 가정하고 주어진 명령을 입력합니다.
# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"
공유 디렉터리를 사용하여 파일을 공유하려면 지정된 명령을 입력하여 컨테이너를 실행합니다.
# docker run -v /path/to/host/dir:/path/to/container/dir ...
참고: 컨테이너의 사용자가 호스트의 사용자와 동일하지 않기 때문에 권한 문제가 발생할 수 있습니다.
johndodoDocker에서 Host로 데이터를 복사하는 명령은 다음과 같습니다.
docker cp container_id:file path/filename /hostpath docker cp a13fb9c9e674:/tmp/dgController.log /tmp/
다음은 호스트에서 도커로 데이터를 복사하는 명령입니다.
docker cp a.txt ccfbeb35116b:/home/
Maninder도커 환경에서 모든 컨테이너는 다음 디렉터리에 있습니다.
/var/lib/docker/aufs/required-docker-id/
소스 디렉토리/파일을 컨테이너의 일부로 복사하려면 다음 명령을 입력하십시오.
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
0x3bfcDocker cp 명령은 컨테이너와 호스트 시스템 간에 파일과 폴더를 복사할 수 있는 편리한 유틸리티입니다.
호스트 시스템에서 컨테이너로 파일을 복사하려면 다음과 같이 docker cp 명령을 사용해야 합니다.
docker cp host_source_path container:destination_path
docker ps 명령을 사용하여 먼저 실행 중인 컨테이너를 나열합니다.
abhishek@linuxhandbook:~$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8353c6f43fba 775349758637 "bash" 8 seconds ago Up 7 seconds ubu_container
컨테이너 ID 또는 컨테이너 이름을 알아야 합니다. 제 경우에는 도커 컨테이너 이름이 ubu_container입니다. 컨테이너 ID는 8353c6f43fba입니다.
파일이 성공적으로 복사되었는지 확인하려면 다음 방식으로 컨테이너를 입력한 다음 일반 Linux 명령을 사용할 수 있습니다.
docker exec -it ubu_container bash
호스트 시스템에서 도커 컨테이너로 파일 복사 docker cp를 사용한 복사는 Linux의 copy 명령과 유사합니다.
컨테이너의 home/dir1 디렉토리에 .py라는 파일을 복사하겠습니다.
docker cp a.py ubu_container:/home/dir1
파일이 성공적으로 복사되면 화면에 출력이 표시되지 않습니다. 대상 경로가 없으면 오류가 표시됩니다.
abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub Error: No such container:path: ubu_container:/home/dir2
대상 파일이 이미 있는 경우 경고 없이 덮어씁니다.
컨테이너 이름 대신 컨테이너 ID를 사용할 수도 있습니다.
docker cp a.py 8353c6f43fba:/home/dir1
Abhishek Patwa호스트가 CentOS 또는 Fedora인 경우 /var/lib/docker/aufs
/proc
아래에 있습니다.
cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root
data
디렉토리의 모든 내용을 ID가 "containerid"인 컨테이너의 /
Abdennour TOUMItar
와 docker cp
는 디렉토리의 모든 것을 복사하기 위한 좋은 조합입니다.
데이터 볼륨 컨테이너 생성
docker create --name dvc --volume /path/on/container cirros
디렉토리 계층 구조를 유지하려면
tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container
작업 확인
docker run --rm --volumes-from dvc cirros ls -al /path/on/container
Everett Toewsmycontainer
가 무엇을 의미하는지 나와 같은 사람에게 명확하지 않은 경우 실제로는 컨테이너 ID입니다. 파일 복사하려면 WarpSquare.mp4
에서 /app/example_scenes/1440p60
내가 이것을 사용하는 현재 폴더에에 Exited 고정 표시기 컨테이너에서.
docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .
여기서 docker ps -q -l
은 마지막으로 종료된 인스턴스의 컨테이너 ID를 가져옵니다. 종료된 컨테이너가 아닌 경우 docker container ls
또는 docker ps
ishandutta2007docker cp SRC_PATH CONTAINER_ID:DEST_PATH
예를 들어 xxxx/download/jenkins 파일을 tomcat에 복사하고 싶습니다.
컨테이너 Tomcat의 ID를 얻기 시작합니다.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 63686740b488 tomcat "catalina.sh run" 12 seconds ago Up 11 seconds 0.0.0.0:8080->8080/tcp peaceful_babbage docker cp xxxx/download/jenkins.war 63686740b488:usr/local/tomcat/webapps/
Mourad MAMASSI컨테이너 업 구문:
docker run -v /HOST/folder:/Container/floder
도커 파일에서
COPY hom* /myFolder/ # adds all files starting with "hom" COPY hom?.txt /myFolder/ # ? is replaced with any single character, eg, "home.txt"
Isura Nimalasiri이 질문을 찾는 많은 사람들은 실제로 Docker 이미지 가 생성되는 동안 파일을 복사하는 데 문제가 있을 수 있습니다(제가 그랬습니다).
이 경우 이미지를 만드는 데 사용하는 Dockerfile
COPY
설명서를 참조하십시오 .
Klas Mellbourn다음을 사용하여 로컬 컴퓨터의 IP 주소를 추적할 수 있습니다.
ifconfig
그런 다음 Docker 컨테이너에 입력하고
scp user_name@ip_address:/path_to_the_file destination
어쨌든 SSH 클라이언트와 서버가 설치되어 있지 않으면 다음을 사용하여 설치하십시오.
sudo apt-get install openssh-server
Harshit AnandTomcat 컨테이너를 실행하면서 단일 파일을 복사하기 위한 온라인 프로그램입니다.
docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat
그러면 war 파일이 webapps 디렉토리에 복사되고 즉시 앱이 실행됩니다.
karthik101내가 가장 좋아하는 방법:
컨테이너:
CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')
파일.txt
mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt
또는
mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
user3159411내가 찾은 컨테이너에 파일을 복사하는 가장 좋은 방법은 docker run 명령의 -v
Prakash Varandani좋은 답변이 있지만 너무 구체적입니다. docker ps
가 관심 있는 컨테이너 ID를 얻는 좋은 방법이라는 것을 알았습니다. 그런 다음
mount | grep <id>
볼륨이 마운트된 위치를 확인합니다. 그건
/var/lib/docker/devicemapper/mnt/<id>/rootfs/
나에게는 있지만 OS와 구성에 따라 다른 경로일 수 있다. 이제 해당 경로에 파일을 복사하기만 하면 됩니다.
-v
사용하는 것이 항상 실용적인 것은 아닙니다.
akostadinov방금 도커를 사용하여 VLC를 컴파일하기 시작했습니다. 컨테이너에서 파일을 앞뒤로 복사하기 위해 수행할 수 있는 작업은 다음과 같습니다.
su - cd /var/lib/docker ls -palR > /home/user/dockerfilelist.txt
해당 txt에서 친숙한 파일을 검색하면 폴더가 생깁니다. 루트로 cd하면 짜잔! 원하는 모든 것을 복사하십시오.
"병합"이 포함된 경로가 있을 수 있으며 "diff"가 포함된 경로를 원할 것입니다.
또한 컨테이너를 종료하고 중단한 위치로 돌아가려면 다음을 수행하십시오.
docker ps -a docker start -i containerid
다음과 같은 명령으로 이름을 지정하지 않았을 때 유용하다고 생각합니다.
docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash
물론 해커 방법이지만 어떻게!
colin lamarre출처 : http:www.stackoverflow.com/questions/22907231/how-to-copy-files-from-host-to-docker-container