etc./StackOverFlow

호스트에서 Docker 컨테이너로 파일을 복사하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 12. 21. 22:07
반응형

질문자 :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

  1. 컨테이너 이름 또는 짧은 컨테이너 ID 가져오기:

     $ docker ps
  2. 전체 컨테이너 ID 가져오기:

     $ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAME
  3. 파일 복사:

     $ 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

일반적으로 세 가지 유형이 있습니다.

  1. 컨테이너에서 호스트로

     docker cp container_id:./bar/foo.txt .

개발1

  1. 호스트에서 컨테이너로

     docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
  2. 호스트에서 컨테이너로 복사하는 두 번째 접근 방식:

     docker cp foo.txt mycontainer:/foo.txt

dev2

  1. 용기에서 용기로 믹스 1과 2

     docker cp container_id1:./bar/foo.txt . docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt

개발3


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

  1. 새 dockerfile을 만들고 기존 이미지를 기반으로 사용합니다.

     FROM myName/myImage:latest ADD myFile.py bin/myFile.py
  2. 그런 다음 컨테이너를 빌드합니다.

     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 사용하지 마십시오.


Aerin

Docker 1.8에서 docker cp 는 호스트에서 컨테이너로 파일을 복사할 수 있습니다. Docker 블로그 게시물 Announcing Docker 1.8: Content Trust, Toolbox, Updates to Registry and Orchestration 을 참조하십시오 .


joemat

컨테이너와 로컬 파일 시스템 간에 파일/폴더를 복사하려면 다음 명령을 입력합니다.

 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 ...

참고: 컨테이너의 사용자가 호스트의 사용자와 동일하지 않기 때문에 권한 문제가 발생할 수 있습니다.


johndodo

Docker에서 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/


0x3bfc

Docker 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 TOUMI

tardocker 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 Toews

mycontainer 가 무엇을 의미하는지 나와 같은 사람에게 명확하지 않은 경우 실제로는 컨테이너 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


ishandutta2007

docker 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 Anand

Tomcat 컨테이너를 실행하면서 단일 파일을 복사하기 위한 온라인 프로그램입니다.

 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

반응형