Quick Syntax
mkdir -p ./out
# host -> container
docker cp ./config.json app:/etc/app/config.json
# running 또는 stopped container -> host
docker cp app:/var/log/app.log ./app.log
# directory 자체를 이미 존재하는 ./out 안에 복사
docker cp app:/var/log ./out
# directory의 내용만 이미 존재하는 ./out 안에 복사
docker cp app:/var/log/. ./outdocker cp는 running·stopped container와 Docker client host 사이에서 파일을 옮깁니다. source와 destination의 끝 slash, /., 부모 directory 존재 여부에 따라 결과가 달라지므로, 운영 명령에는 목적지 path를 먼저 만듭니다.
경로 규칙
container path는 / 기준이라 initial slash는 선택 사항입니다. app:/tmp/file과 app:tmp/file은 같은 위치를 뜻하지만, local path는 docker cp를 실행한 현재 directory 기준입니다. local path 이름에 :가 있다면 ./file:name이나 absolute path처럼 local path임을 명시합니다.
mkdir -p ./out
docker cp app:/var/log ./out # ./out/log/...
docker cp app:/var/log/. ./out # ./out 안에 log의 내용만 복사source가 file이고 destination이 이미 directory면 file basename이 그 안에 복사됩니다. source가 directory이고 destination이 file이면 오류입니다. source·destination 부모 directory가 없으면 docker cp가 만들어 주지 않으므로, container 안으로 복사하기 전에 target parent가 있는지도 확인합니다.
docker exec app mkdir -p /etc/app
docker cp ./settings.json app:/etc/app/settings.json권한과 연결
기본 동작은 가능한 범위에서 permission을 보존하지만 ownership은 destination 기준입니다. host에서 container로 복사한 file은 기본으로 root UID/GID가 되고, container에서 host로 복사한 file은 docker cp를 실행한 local user UID/GID가 됩니다. -a는 source UID/GID 보존을 요청합니다.
# source ownership까지 보존
docker cp --archive app:/data ./data-copy
# 기본은 symlink 자체를 복사, -L은 link target을 복사
docker cp --follow-link app:/var/current.log ./current.loghost user와 container user의 UID/GID가 다르면 analysis file을 수정하지 못하거나, 복원한 config가 application에서 읽히지 않을 수 있습니다. -a를 습관적으로 쓰기보다 target host·container에서 필요한 ownership을 먼저 정합니다.
조사와 데이터 경계
docker cp는 stopped container에도 쓸 수 있으므로, process가 바로 죽었을 때 writable layer의 resolved config나 temporary log를 꺼내는 데 유용합니다. 다만 docker rm이나 --rm 뒤에는 해당 layer가 사라집니다.
docker ps -a --filter status=exited
docker cp failed-app:/tmp/startup.log ./startup.log
docker inspect failed-app --format '{{.State.ExitCode}}'/proc, /sys, /dev, tmpfs, container 안에서 사용자가 만든 mount 같은 일부 경로는 docker cp로 복사할 수 없습니다. 이 경우 running container에서 tar를 docker exec로 stream하는 방법을 검토합니다. DB data, 업로드 file처럼 반복 보존할 데이터는 docker cp가 아니라 volume·backup 절차로 관리합니다.
docker cp는 임시 추출 도구이지 영속 데이터 설계가 아닙니다. running DB의 data directory를 cp로 꺼내면 일관성이 보장되지 않으며, container를 삭제한 뒤에는 writable layer의 파일도 복구할 수 없습니다.
참고 링크
1 sources