숏컷 코드
docker cp ./config.json app:/etc/app/config.json
docker cp app:/var/log/app.log ./app.log
docker cp app:/var/log ./logs
docker cp app:/var/log/app.log - | tar x -O
docker cp -a app:/data ./data-copy파일 흐름
CONTAINER:PATH는 컨테이너 내부 경로를 가리킨다
docker cp는 호스트 파일시스템과 컨테이너 파일시스템 사이에서 파일이나 디렉터리를 복사합니다. 컨테이너 쪽 경로는 컨테이너이름:/path 형식으로 지정하고, 호스트 쪽 경로는 현재 작업 디렉터리 기준 상대 경로나 절대 경로를 쓸 수 있습니다.
# 호스트에서 컨테이너로 복사
docker cp ./settings.json app:/etc/app/settings.json
# 컨테이너에서 호스트로 복사
docker cp app:/var/log/app.log ./app.log컨테이너 내부 경로는 루트(/) 기준입니다. app:/tmp/file과 app:tmp/file은 컨테이너 안의 같은 위치로 해석될 수 있으므로, 운영 문서나 스크립트에서는 /를 명시하는 편이 읽기 쉽습니다.
실행 중이 아니어도 컨테이너 파일은 꺼낼 수 있다
docker exec는 실행 중인 컨테이너에만 쓸 수 있지만, docker cp는 중지된 컨테이너에도 사용할 수 있습니다. 프로세스가 바로 죽어서 shell로 들어갈 수 없는 상황에서는 먼저 컨테이너를 남겨 두고 파일을 꺼내는 방식이 유용합니다.
docker ps -a
docker cp failed-app:/tmp/startup.log ./startup.log
docker cp failed-app:/app/config.resolved.json ./config.resolved.json단, docker rm으로 컨테이너를 삭제하면 writable layer도 사라집니다. 장애 조사 전에 --rm으로 실행한 컨테이너라면 종료와 동시에 파일을 꺼낼 기회가 없어질 수 있습니다.
디렉터리 복사는 목적지 존재 여부에 따라 결과가 달라진다
파일을 복사할 때와 디렉터리를 복사할 때 목적지 경로의 존재 여부가 중요합니다. 목적지 디렉터리가 이미 있으면 그 안에 들어가고, 없으면 새 디렉터리로 만들어질 수 있습니다. 존재하지 않는 부모 디렉터리는 자동으로 만들지 않으므로 사전에 경로를 준비해야 합니다.
# /tmp/logs 디렉터리 자체가 ./logs 아래로 복사될 수 있음
docker cp app:/tmp/logs ./logs
# 컨테이너 내부 목적지의 부모 디렉터리는 미리 있어야 함
docker exec app mkdir -p /etc/app
docker cp ./settings.json app:/etc/app/settings.json컨테이너 안에서 생성된 런타임 파일을 임시로 꺼내는 데는 편하지만, 반복적으로 필요한 데이터 공유라면 volume이나 bind mount가 더 명확합니다.
권한과 소유권은 복사 방향에 따라 달라질 수 있다
기본 복사는 가능한 범위에서 권한을 보존하지만, 목적지 쪽 사용자와 그룹 기준으로 소유권이 달라질 수 있습니다. -a를 사용하면 source의 소유권을 보존하려고 시도합니다. symlink를 따라가야 할 때는 -L을 명시합니다.
# 소유권 보존 시도
docker cp -a app:/data ./data-copy
# symlink 대상 파일을 따라 복사
docker cp -L app:/var/current.log ./current.logLinux 컨테이너의 UID/GID가 호스트 사용자와 맞지 않으면 복사한 파일을 바로 수정하지 못할 수 있습니다. 백업이나 분석용 복사 후에는 호스트에서 소유권과 권한을 확인해야 합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 컨테이너 로그 파일 추출 | docker cp app:/path/file ./file |
| 중지된 컨테이너 조사 | docker cp <stopped>:/path ./out |
| 반복 데이터 공유 | docker cp보다 volume/bind mount |
| 권한 보존 필요 | docker cp -a |
| symlink 대상 복사 | docker cp -L |
| 목적지 부모 디렉터리 | 사전에 생성 필요 |
주의할 점
docker cp는 임시 추출 도구이지 영속 데이터 설계가 아닙니다. DB 데이터, 업로드 파일, 사용자 생성 파일처럼 계속 유지되어야 하는 데이터는 volume을 사용하고, docker cp는 장애 분석이나 일회성 이동에 제한하는 편이 안전합니다.
컨테이너 삭제 후에는 writable layer의 파일을 다시 꺼낼 수 없습니다. 장애 분석이 필요한 컨테이너는 즉시 삭제하지 말고 docker ps -a, docker inspect, docker logs, docker cp 순서로 근거를 확보한 뒤 정리해야 합니다.
참고 링크
1 sources