호스트에서 Docker 컨테이너로 파일 복사


1577

우리가 작업하는 Docker 컨테이너의 백업 및 복원 솔루션을 구축하려고합니다.

나는 내가 만든 Docker 기본 이미지를 가지고 있으며 ubuntu:base파일을 추가하기 위해 Docker 파일로 매번 다시 빌드하지 않아도됩니다.

호스트 컴퓨터에서 실행되는 스크립트를 만들고 ubuntu:baseDocker 이미지를 사용하여 새 컨테이너를 만든 다음 파일을 해당 컨테이너에 복사하려고합니다.

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


11
다시 빌드하고 싶지 않다면 왜 " docker commit "? 이미지가 저장됩니다.
Berend de Boer

27
아무도 언급하지 않은 개념에 대한 언급 : 일반적으로 컨테이너를 "일시적인"것으로 취급하십시오. 실행중인 컨테이너와 파일을 복사하는 유스 케이스가 있습니다 (테스트, 프로토 타이핑). 그러나 Dockerfiles 및 / 또는 작성을 사용하여 필요한 것을 다시 작성할 수없는 위치에있는 경우 나쁜 장소에있을 수 있습니다. 일반적으로 컨테이너가 OS 또는 VM 개체 인 것처럼 컨테이너를 백업하지 않으려 고합니다. 일반적으로 말하기 :-)
Scott Prive

답변:


2673

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

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

docker cp foo.txt mycontainer:/foo.txt

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

docker cp mycontainer:/foo.txt foo.txt

강조를 위해, mycontainerA는 컨테이너 ID, 하지 화상 ID.

폴더에 포함 된 여러 파일 을 다음을 사용 src하여 target폴더에 복사 할 수 있습니다 .

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

참조 : Docker CLI 문서cp

1.8 이전의 Docker 버전에서는 파일을 컨테이너에서 호스트로 복사하는 것만 가능했습니다. 호스트에서 컨테이너로가 아닙니다.


2
또한 이것은 호스트 vm 또는 기본 OS에있을 수 있으며 호스트에서 컨테이너로 또는 vm에서 호스트로 (또는 메인 OS) 작동합니다.
Adam Tuliper-MSFT

7
Dockerfile에서 ADD 키워드를 사용하여 빌드 시간 동안 파일을 추가 할 수 있습니다.
0x7d7b

4
해당되는 경우 @ h3nrik가 COPY선호ADD 됩니다.
Franklin Yu

10
사용하는 docker cp호스트가 잘 작동에 컨테이너 복사하는 것이 아니라 때 컨테이너에 호스트에서 파일을 복사하는 데 사용, 효과 없음 ... 사람을 알고 그 이유는 무엇입니까? 도커 버전 : 도커 버전 1.10.3, 빌드 cb079f6- 지원되지
않음

2
docker cp를 사용하여 호스트에서 컨테이너로 여러 파일을 복사 할 수 있습니까?
Yogesh

182
  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

13
나를 위해 호스트의 설치 경로는 포함되지 않았다 aufs하지만 devicemapper. 컨테이너 장착 경로를 확인하는 가장 쉬운 방법은 (실행중인 동안) 명령을 실행하는 것 mount입니다.
derenio

3
위의 해결책을 시도했습니다. 파일을 docker specific directory에 복사했습니다. 그러나 도커 컨테이너에 bash를 사용하면 파일이 표시되지 않습니다. 내가 놓친 것이 있습니까?
AppleBud

2
새로운 경로는 / var / lib / docker / devicemapper / mnt / << id >> / rootfs /
mcuadros

4
나를 위해, Docker 1.4.1 (현재 최신)에서/var/lib/docker/aufs/diff/<id>/
user193130

3
열악한 MacOS 사용자는 어떻습니까? 마운트 디렉토리가 /var/lib있습니다. find / -name docker도움이되지 않았습니다.
prayagupd

141

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

{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

3
컨테이너를 어떻게 실행할 수 있습니까? 나는 당신이 이미지로만 할 수 있다고 생각했습니다.
Pavel Zaitsev

컨테이너가 이미 일어 났을 때 컨테이너가 작동하면 작동하지 않습니다. 아래 타르가 잘 작동합니다.
Eino Mäkitalo

1
이것이 나를 위해 일한 유일한 방법은 이미지 실행과 함께 볼륨을 연결하는 것입니다 (컨테이너를 나타냅니다). :와 종료docker run -d -p -v /host/path:/mnt --name container_name image_name
피터 N

2
이것은 나를 위해 작동하지 않습니다. Atleast는 컨테이너를 실행할 수 없습니다. 이미지 만 실행할 수 있음
Shashank Hegde

1
나는 그것이 docker cp일방 통행 조작 인 것에 놀랐다 !
ThorSummoner

115

다음은 상당히 추한 방법이지만 작동합니다.

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

7
이것은 잘 작동합니다! 그러나 변경 사항을 커밋하는 것을 잊지 마십시오 docker commit `docker ps -l -q` ubuntu-with-file. 그렇지 않으면 변경 사항이 손실됩니다 (대신에 원하는 이름을 사용하십시오 ubuntu-with-file)
Michael_Scharf

@Erik : 컨테이너가 실행될 때 파일이 어디에 있습니까?
coanor

49
또한 새로운 docker exec기능을 사용하여 컨테이너 실행 작업을 할 수 있습니다 .docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
Mikl

17
@Mikl 파일 docker exec -i ...대신에 -itTTY가 없기 때문에 대신 대신 해야한다고 생각 합니다.
z0r

4
여전히 이전 버전의 Docker에 붙어 있고 전체 디렉토리를 복사하려는 경우 다음을 수행 할 수 있습니다. tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
eahanson

43

실행중인 컨테이너 에서이 작업을 수행 해야하는 경우 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컨테이너에서 exec를 실행 하고 작동하는지 확인할 수 있습니다.

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2

Centos 7.4의 docker 1.16에서 훌륭하게 작동합니다.
Dudi Boy

41
  1. 새 dockerfile을 만들고 기존 이미지를 기본으로 사용하십시오.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. 그런 다음 컨테이너를 빌드하십시오.

    docker build .
    

2
이것이 나를 위해 일한 것입니다. 아무것도 아니야. 감사합니다!
Owen

직접 새 컨테이너가 아닌 새 이미지를 만듭니다. myFile.py를 변경 한 상태에서이 이미지를 재사용하면 이미지를 다시 작성하지 않는 한 파일의 이전 버전이 사용됩니다.
기 illa 레 브레 턴

원격 서버에서 테스트하는 경우에만 가장 빠른 방법입니다.
도미니크 Krulak

에 따르면 대부분의 사람들은 오히려 ADD보다 COPY를 사용해야합니다. 그러나 로컬 파일 (이 예에서와 같이)은 동일합니다.
hoosierEE

39

해결책은 다음과 같습니다.

Docker 셸에서

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

호스트에서

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

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


10
좋은 대답입니다. 새로운 고정 표시기 릴리스에서 경로 이름이 변경되었습니다로는 / var / lib 디렉토리 / 고정 표시기 / AUFS을 / mnt /
알렉스 볼코프

도커 1.6이있는 페도라에서 devicemapper 경로가 작동하지 않는 것 같습니다. 별도의 Q, stackoverflow.com/questions/29939419/… 으로 올리십시오 . 의견이 있으면 감사하겠습니다.
Yogesh_D

33

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

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

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

dev1

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

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./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


6
docker cp는 두 가지 방식으로 작동합니다. exec, cat 및 redirect 할 필요가 없습니다. docker cp host_file.txt 컨테이너 : / path /
tbm

32

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

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

파일 foo.sh/tmp컨테이너에 복사합니다 .

편집 : Maarten 의 의견 -f덕분에 reduntant를 제거하십시오 .


전체 디렉토리를 보내야하는 경우에 좋습니다. 단일 파일의 경우 Erik의 대답이 더 간단합니다.
Kelvin

1
@Kelvin : 그러나 tar는 파일 속성과 이름도 유지합니다. 그 중에서도 이름을 한 번만 입력하면됩니다 (쉘에서 탭 완성을 얻음). 따라서 tar가 컨테이너에 설치되어 있으면 tar가 실제로 더 간단하다고 말하고 싶습니다.
Maarten

1
-f -, 기본 동작은 어쨌든 stdout에 작성하는 것입니다하지만 약간의 중복입니다.
Maarten

이것은 tar
cellige

맞습니다. 호스트와 컨테이너 내에 tar를 설치해야합니다. 오늘날 docker cp를 사용하는 것이 더 나은 솔루션입니다.
joemat

24

호스트에서 실행중인 컨테이너 로 파일을 복사하려면

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

를 기반으로 에릭의 대답 과 Mikl의 및 z0r의 의견.


허용 된 솔루션은 때때로 실행중인 컨테이너로 전송할 때 파일 들여 쓰기를 방해합니다. 이것은 그러한 경우에 완벽하게 작동합니다
Dreams


15

이것은 제목 의이 질문에서 제기 된 '호스트에서 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 컨테이너에 볼륨을 추가하는 방법을 참조하십시오 . .


15

여기에서 대부분의 (공개 된) 솔루션을 시도했지만 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.


12

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

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

예를 들어

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

contianer ID를 얻으려면 주어진 명령을 입력하십시오.

docker ps

위 내용은 docker.com 에서 가져 왔습니다 .


8

컨테이너가 이미 실행 중이라고 가정하면 주어진 명령을 입력하십시오.

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

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


1
또한 :docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
Mikl

2
참고 cat가 종료되면 종료되지 않습니다. bash 스크립트를 복사하는 경우 bash는 스크립트 실행을 거부 합니다. 해당 파일을 보유한 프로세스를 실행 lsof | grep yourfilename하고 종료 해야 cat합니다.
johndodo

고마워! 좋은 팁. 하나의 명령 으로이 프로세스를 종료하는 방법을 알려주시겠습니까? 같은 것 kill $(lsof | grep /path/to/file | sed ...). 도와
주셔서

kill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Mikl

8

이것은 Docker에서 Host로 데이터를 복사하는 명령입니다.

docker cp container_id:file path/filename /hostpath

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

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

docker cp a.txt ccfbeb35116b:/home/

7

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

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

소스 디렉토리 / 파일을 컨테이너의 어느 부분으로 복사하려면 주어진 명령을 입력하십시오.

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


5

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

5

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

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

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


이것은 Redhat 고유의 것이 아닙니다 : Debian에서도 작동합니다. (아마도 모든 Gnu / Linux 포함 /proc). 또한 루트뿐만 아니라 파일을 다른 곳에 두도록 경로를 확장하십시오.
ctrl-alt-delor

5

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 lsdocker ps


1
당신과 종료 용기의 ID 나열 할 수 있습니다 docker ps -a또는 docker container ls -a.
0x7d7b

4

이 질문을 찾는 많은 사람들은 실제로 파일을 만드는 동안 파일을 Docker 이미지로 복사하는 데 문제가있을 수 있습니다 (내가 했음 ).

이 경우 이미지를 작성하는 데 사용하는 COPY명령 Dockerfile을 사용할 수 있습니다.

설명서를 참조하십시오 .


4

당신은 사용하여 로컬 컴퓨터의 IP 주소를 추적 할 수 있습니다

ifconfig

그런 다음 Docker 컨테이너에 들어가서 입력하십시오.

scp user_name@ip_address:/path_to_the_file destination

어쨌든 SSH 클라이언트와 서버가 설치되어 있지 않은 경우 다음을 사용하여 설치하십시오.

sudo apt-get install openssh-server

고맙습니다, 그것은 나를 위해 잘 작동했습니다. 게다가, 나는 다른 방법보다 더 효율적 그것을 발견
user1314742

이것은 보안 측면에서 끔찍한 해결책입니다.

4

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

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

그러면 war 파일이 webapps 디렉토리에 복사되고 앱이 곧 실행됩니다.


1
-v는 복사하지 않고 마운트 (즉, 링크 생성)
Vitaliy Ulantikov

결과의 차이점은 마운트하면 이전 컨테이너 컨텐츠를 숨기는 것입니다. 예를 들어 컨테이너 폴더에 호스트 폴더를 마운트하면 더 이상 이전 컨테이너 폴더 컨텐츠를 볼 수 없습니다
mrq

4

컨테이너 업 구문 :

 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"

3

내가 찾은 컨테이너에 파일을 복사하는 가장 좋은 방법 -v은 docker run 명령 옵션을 사용하여 호스트에 디렉토리를 마운트하는 것 입니다.


3

좋은 답변이 있지만 너무 구체적입니다. 내가 알아 docker ps컨테이너 ID 당신에게있는 거 관심 분야를 얻을 수있는 좋은 방법입니다. 그런 다음 할

mount | grep <id>

볼륨이 마운트 된 위치를 확인하십시오. 그게

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

나에게는 있지만 OS와 구성에 따라 다른 경로 일 수 있습니다. 이제 파일을 해당 경로로 복사하십시오.

사용 -v이 항상 실용적이지는 않습니다.


3

방금 docker를 사용하여 VLC를 컴파일하기 시작했습니다. 컨테이너에서 파일을 앞뒤로 복사하는 방법은 다음과 같습니다.

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

해당 txt에서 익숙한 파일을 검색하면 폴더가 루트 및 voila로 cd됩니다! 당신이 원하는 모든 것을 복사하십시오.

"병합"된 경로가있을 수 있습니다. "diff"가있는 경로가 필요합니다.

또한 컨테이너를 종료하고 중단 한 위치로 돌아가려면 다음을 수행하십시오.

docker ps -a
docker start -i containerid

나는 당신이 같은 명령으로 아무것도 이름을 지정하지 않았을 때 유용하다고 생각합니다

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

해커 방법은 물론입니다!


3
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/

2

내가 가장 좋아하는 방법 :

컨테이너 :

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

도커 1.6이있는 페도라에서 devicemapper 경로가 작동하지 않는 것 같습니다. 별도의 Q, stackoverflow.com/questions/29939419/… 으로 올리십시오 . 의견이 있으면 감사하겠습니다.
Yogesh_D

2

내 의견으로는 이미지 내부의 파일을 복사 할 필요는 없지만 파일에 GIT 또는 SVN을 사용한 다음 로컬 폴더와 동기화 된 볼륨을 설정할 수 있습니다. 컨테이너를 실행하는 동안 GIT 저장소에서 데이터를 복사하지 않은 경우 로컬 폴더에 데이터가 이미 있는지 확인할 수있는 스크립트를 사용하십시오. 이미지가 매우 가벼워집니다.


이것은 보안 위험과 액세스 악몽이 일어나기를 기다리는 것처럼 보입니다. 이미지 내에서 git 저장소에 대한 액세스를 어떻게 제공합니까? 공용 저장소라고 가정하더라도 컨테이너가 실행되는 호스트가 해당 리포지토리에 액세스 할 수 있다고 가정합니다.
tbm

도커 컨테이너 내부에 git이 사용되면 동의합니다. 그러나이 경우 스크립트는 호스트 컴퓨터에서 실행됩니다
h.aittamaa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.