source

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

nicesource 2023. 8. 12. 10:26
반응형

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

저는 우리가 함께 작업하는 도커 컨테이너에 대한 백업 및 복원 솔루션을 구축하려고 합니다.

이미지를 있습니다, 제만도베이가있를다습니고지가미지이커든스▁dock▁that▁have▁image▁ier▁base,다있니습▁i▁created제가▁have가고지를만.ubuntu:base파일을 추가하기 위해 도커 파일을 사용하여 매번 재작성할 필요가 없습니다.

시스템에서 실행되는 새 하여 새 .ubuntu:base이미지를 도킹한 다음 해당 컨테이너에 파일을 복사합니다.

호스트에서 컨테이너로 파일을 복사하려면 어떻게 해야 합니까?

cp명령을 사용하여 파일을 복사할 수 있습니다.

다음과 같이 특정 파일 하나를 컨테이너에 복사할 수 있습니다.

docker cp foo.txt container_id:/foo.txt

컨테이너에서 다음과 같은 특정 파일을 복사할 수 있습니다.

docker cp container_id:/foo.txt foo.txt

강하자면조.container_id이미지 ID가 아닌 컨테이너 ID입니다. (사용)docker ps가 포함된 container_ids.)

src으로 복사할 수 .target사용하는 폴더:

docker cp src/. container_id:/target
docker cp container_id:/src/. target

참조:도커 CLI 문서:

1.8 이전 버전의 도커에서는 컨테이너에서 호스트로 파일을 복사하는 것만 가능했습니다.호스트에서 컨테이너로 이동할 수 없습니다.

  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

가장 깨끗한 방법은 컨테이너를 시작할 때 컨테이너에 호스트 디렉토리를 마운트하는 것입니다.

{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

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

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

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

도.docker cp명령은 두 가지 방식으로도 작동합니다.

dev1

  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
    

dev3

다음은 꽤 추악한 방법이지만 효과가 있습니다.

docker run -i ubuntu /bin/bash -c 'cat > file' < file

실행 중인 컨테이너에서 이 작업을 수행해야 하는 경우 도커 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

에서는 위의예에서는다사수있용습다니할음을있다▁▁in습▁either▁can▁above▁the를 사용할 수 있습니다.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
  1. 새 도커 파일을 만들고 기존 이미지를 기반으로 사용합니다.

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

    docker build .
    

해결책은 아래와 같습니다.

도커 쉘로부터,

root@123abc:/root#  <-- get the container ID

호스트에서

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

파일은 컨테이너가 파일 시스템에 있는 위치에 직접 복사해야 합니다.

실행 중인 컨테이너에 파일을 복사하기 위한 또 다른 솔루션은 tar를 사용하는 것입니다.

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

니 파일을 합니다.foo.sh안으로/tmp용기의.

: 제거 : 리던던트-f마르텐스의 코멘트 덕분입니다.

호스트에서 실행 중인 컨테이너로 파일을 복사하려면 다음과 같이 하십시오.

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

에릭의 답변과 Mikl의 코멘트와 z0r의 코멘트를 바탕으로 합니다.

제목의 이 질문에서 제기된 '호스트에서 도커 컨테이너로 파일 복사' 질문에 대한 직접적인 답변입니다.

ㅠㅠdocker cp그것은 가장 쉬운 방법이며 내 Mac에서도 작동합니다.용도:

docker cp /root/some-file.txt some-docker-container:/root

됩니다.some-file.txt./root합니다. 이름은 "Docker"입니다.some-docker-container합니다./root보안 복사 구문에 매우 가깝습니다.그리고 이전 게시물과 같이 반대로 사용할 수 있습니다.즉, 컨테이너에서 호스트로 파일을 복사합니다.

그리고 이 게시물을 다운링크하기 전에 입력하십시오.docker cp --help설명서를 읽는 것은 매우 도움이 될 수 있습니다. 가끔은...

이러한 방식이 마음에 들지 않고 이미 생성되어 실행 중인 컨테이너에 데이터 볼륨을 저장하려면 현재 재생이 유일한 옵션입니다.참고 항목기존 도커 컨테이너에 볼륨을 추가하려면 어떻게 해야 합니까?

여기서 대부분의 (업데이트된) 솔루션을 시도했지만 도커 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.

1과 함께, 도커 1.8 버전docker cp호스트에서 컨테이너로 파일을 복사할 수 있습니다.도커 블로그 게시물 도커 1.8: 콘텐츠 신뢰, 도구 상자 및 레지스트리오케스트레이션 업데이트를 참조하십시오.

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

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

예를들면,

docker cp /home/foo container-id:/home/dir

컨테이너 ID를 가져오려면 지정된 명령을 입력합니다.

docker ps

위의 내용은 docker.com 에서 가져온 것입니다.

컨테이너가 이미 실행 중이라고 가정하고 지정된 명령을 입력합니다.

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

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

컨테이너 실행 구문:

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, e.g., "home.txt"

다음은 도커에서 호스트로 데이터를 복사하는 명령입니다.

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

다음은 호스트에서 도커로 데이터를 복사하는 명령입니다.

docker cp a.txt ccfbeb35116b:/home/
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

대상 경로는 이전 경로여야 합니다.

도커 환경에서 모든 컨테이너는 다음 디렉터리에 있습니다.

/var/lib/docker/aufs/required-docker-id/

원본 디렉터리/파일을 컨테이너의 모든 부분에 복사하려면 지정된 명령을 입력합니다.

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

Docker cp 명령은 컨테이너와 호스트 시스템 간에 파일 및 폴더를 복사할 수 있는 편리한 유틸리티입니다.

호스트 시스템에서 컨테이너로 파일을 복사하려면 다음과 같은 docker cp 명령을 사용해야 합니다.

docker cp host_source_path container:destination_path

도커 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입니다.

파일이 성공적으로 복사되었는지 확인하려면 다음과 같은 방법으로 컨테이너를 입력한 다음 일반 리눅스 명령을 사용할 수 있습니다.

docker exec -it ubu_container bash

호스트 시스템에서 도커 컨테이너로 파일 복사 도커 cp를 사용한 복사는 Linux의 copy 명령과 유사합니다.

저는 a.py 라는 이름의 파일을 컨테이너에 있는 home/slot1 디렉토리에 복사하려고 합니다.

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

해라docker cp.

용도:

docker cp CONTAINER:PATH HOSTPATH

파일/폴더를 복사합니다.PATH에게HOSTPATH.

호스트가 CentOS 또는 Fedora인 경우 프록시가 없습니다./var/lib/docker/aufs하지만 그것은 아래에 있습니다./proc:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

이 cmd는 의 모든 내용을 복사합니다.data로의 디렉토리./ID가 "containerid"인 컨테이너입니다.

tar그리고.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

이 질문을 발견한 많은 사람들은 실제로 파일이 생성되는 동안 도커 이미지에 파일을 복사하는 문제가 있을 수 있습니다(제가 작성했습니다).

그런 경우에는 다음을 사용할 수 있습니다.COPY의 지휘권.Dockerfile이미지를 생성하는 데 사용합니다.

설명서를 참조하십시오.

나 같은 사람이 무슨 말을 하는지 모를 경우.mycontainer@h3nrik 응답은 실제로 컨테이너 ID를 의미합니다.파일 복사하기WarpSquare.mp4/app/example_scenes/1440p60종료된 도커 컨테이너에서 현재 폴더로 이동합니다.

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

docker ps -q -l마지막으로 종료한 인스턴스의 컨테이너 ID를 풀업합니다.종료된 용기가 아닌 경우 다음 방법으로 얻을 수 있습니다.docker container ls또는docker ps

docker cp SRC_PATH CONTAINER_ID:DEST_PATH

예를 들어, xxxx/download/jenkins 파일을 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/

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH호스트 시스템에서 컨테이너로 복사합니다.

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH컨테이너에서 호스트 시스템으로 복사합니다.

Tomcat 컨테이너를 실행하는 동안 단일 파일을 복사하기 위한 온라인입니다.

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

이렇게 하면 war 파일이 webapps 디렉토리에 복사되고 앱이 즉시 실행됩니다.

이것이 저에게 효과가 있었던 것입니다.

#Run the docker image in detached mode 
$docker run -it -d test:latest bash

$ docker ps
CONTAINER ID        IMAGE               COMMAND
a6c1ff6348f4        test:latest     "bash"

#Copy file from host to container
sudo docker cp file.txt a6c1ff6348f4:/tmp

#Copy the file from container to host
docker cp test:/tmp/file.txt /home

내가 가장 좋아하는 방법:

컨테이너:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

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

언급URL : https://stackoverflow.com/questions/22907231/how-to-copy-files-from-host-to-docker-container

반응형