HOWTO · Docker

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

이 튜토리얼은 호스트에서 Docker 컨테이너로 파일을 복사하는 방법을 보여줍니다.

이 페이지의 내용

기존 컨테이너에 파일을 한 번만 전송하려면 로컬 원본과 컨테이너 대상 경로를 지정하여 docker cp를 사용합니다.

docker cp ./local-file CONTAINER:/existing-directory/

CONTAINER를 컨테이너 이름 또는 ID로 바꾸십시오. docker cp는 실행 중인 컨테이너와 중지된 컨테이너 모두에 사용할 수 있습니다. 상대 로컬 경로는 명령을 실행한 디렉터리에서 해석되고, 컨테이너 경로는 /를 기준으로 합니다(첫 슬래시는 생략 가능). 전체 규칙은 Docker cp 참조에서 확인할 수 있습니다.

기존 컨테이너에 파일 복사

다음 명령은 현재 호스트 디렉터리의 hello.txtdemo-app 컨테이너의 /opt/로 복사합니다. 대상 디렉터리는 미리 존재해야 합니다.

docker cp ./hello.txt demo-app:/opt/

/opt/가 존재하면 컨테이너에는 /opt/hello.txt가 생깁니다. 끝의 슬래시는 기존 대상 디렉터리를 뜻한다는 점을 분명히 합니다. 대상이 기존 파일이면 docker cp가 그 내용을 덮어쓰므로 위험할 때는 먼저 확인하십시오.

실행 중인 컨테이너에서 복사 결과를 확인하려면 대화형 셸 대신 직접 명령을 실행합니다.

docker exec demo-app ls -l /opt/hello.txt

목록에 파일이 표시되면 성공입니다. docker exec에는 실행 중인 컨테이너가 필요하지만 docker cp는 중지된 컨테이너도 허용합니다.

디렉터리 또는 그 내용만 복사

docker cp는 디렉터리를 재귀적으로 복사합니다. 원본 표기에 따라 디렉터리 자체를 넣을지 그 안의 내용만 넣을지가 달라집니다.

# Creates /opt/host-files/ in the container.
docker cp ./host-files demo-app:/opt/

# Copies the contents of host-files into the existing /opt/incoming/ directory.
docker cp ./host-files/. demo-app:/opt/incoming/

두 번째 명령에서는 /opt/incoming/가 존재해야 합니다. /. 접미사는 host-files라는 추가 디렉터리 없이 내용만 복사합니다. Docker는 없는 부모 디렉터리를 만들지 않으므로, /로 끝나는 대상은 기존 디렉터리여야 합니다. 자세한 파일·디렉터리 규칙은 docker cp 대상 규칙을 참조하십시오.

docker cp, Dockerfile COPY, bind mount 선택

필요한 작업 사용할 방법 이유
기존 컨테이너 하나에 지금 파일 추가 docker cp 해당 컨테이너 파일 시스템에 일회성 복사본을 만듭니다.
모든 이미지 빌드에 파일 포함 Dockerfile COPY 빌드 컨텍스트의 파일을 이미지에 추가합니다.
개발 중 호스트 디렉터리를 컨테이너와 공유 bind mount 런타임에 경로를 공유하며 별도 복사본을 만들지 않습니다.

애플리케이션 파일을 이미지에 넣으려면 Dockerfile에 작성합니다.

COPY ./config.yaml /app/config.yaml

COPY는 빌드 시 명령이며 이미 존재하는 컨테이너를 수정하는 방법이 아닙니다. 원본 경로는 빌드 컨텍스트를 기준으로 해석되므로 일반적으로 그 밖의 경로는 사용할 수 없습니다. Dockerfile COPY 참조를 확인하십시오.

반복해서 공유하려면 컨테이너를 만들 때 bind mount를 지정합니다.

docker run --mount type=bind,source=/absolute/host/path,target=/app/input,readonly IMAGE

bind mount는 복사가 아니라 공유 저장소입니다. readonly가 없으면 컨테이너 프로세스가 접근 가능한 호스트 파일을 수정하거나 삭제할 수 있습니다. 실제로 필요한 것이 공유라면 호스트 디렉터리를 마운트하여 파일을 실시간으로 공유하는 방법을 참조하십시오. Docker는 bind mount의 공유 및 권한 관련 주의점도 설명합니다.

또한 docker cp를 이미지 구성에 사용하지 마십시오. 복사본은 이 컨테이너의 쓰기 가능 파일 시스템에 남아 같은 컨테이너를 중지·재시작하면 유지되지만, 이미지에서 새로 만든 교체 컨테이너에는 나타나지 않습니다.

흔한 docker cp 오류 방지

복사 전에 경로를 확인하십시오. 로컬 원본은 존재해야 합니다. 로컬 파일을 끝 슬래시가 없는 존재하지 않는 대상으로 복사하면 Docker가 그 정확한 경로에 파일을 만들 수 있지만 부모 디렉터리는 만들지 않습니다. 원본이 디렉터리이면 부모가 존재할 때 최종 대상 디렉터리는 만들 수 있지만, 파일 위로 디렉터리를 복사할 수는 없습니다.

기본적으로 컨테이너에 복사한 파일의 소유자는 대상 사용자와 그룹(보통 root:root)입니다. 원본 UID와 GID 보존이 컨테이너 사용자에게 적합할 때만 -a를 사용하십시오. 로컬 심볼릭 링크는 기본적으로 링크 자체가 복사되며, 대상 파일을 복사하려면 -L을 사용합니다. 대상 권한도 유용한 복사를 막을 수 있습니다.

마지막으로 docker cp/proc, /sys, /dev 아래 리소스, 임시 파일 시스템, 사용자가 만든 마운트 등 일부 컨테이너 시스템 경로를 복사할 수 없습니다. 이런 경우에는 컨테이너별 방법을 사용하고 문서화된 제한을 검토하십시오.