본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Containerd

Ctr snapshot 명령을 이용해서 컨테이너에 파일 복사하기

by bluefriday 2021. 11. 8.
반응형

컨테이너를 사용하여 작업을 할때 보통 'docker cp' 명령을 사용해서 컨테이너 안에 쉽게 파일을 복사한다.

docker를 사용하지 않고 containerd를 런타임으로 사용하는 경우에도, 보통은 kubernetes 클러스터를 구축하였을 경우 kubectl 에서 제공하는 'kubectl cp' 명령어를 사용하여 쉽게 파드에 파일을 복사할 수 있다.

그런데 'kubectl cp' 의 경우 아래와 같이 help 명령어에서 알 수 있듯이 복사하려는 파드에서 tar 바이너리 파일이 있어야만 복사가 가능하다. docker cp 명령어와는 달리 내부적으로 tar 압축/압축해제 로직이 포함되어 있는 듯 하다.

kubectl cp -h
Copy files and directories to and from containers.

Examples:
  # !!!Important Note!!!
  # Requires that the 'tar' binary is present in your container
  # image.  If 'tar' is not present, 'kubectl cp' will fail.
  #
  # For advanced use cases, such as symlinks, wildcard expansion or
  # file mode preservation, consider using 'kubectl exec'.
...

컨테이너 이미지 안에 tar 바이너리 파일이 없는 경우에는 ctr명령어가 제공하는 snapshot 명령을 사용하여 파일을 복사할 수 있다. 명령어 레벨에서 제공하는 '복사' 기능은 아니며 우회하는 방법이긴하다.

수행 내용은 다음과 같다.

  1. 로컬에 임시 디렉토리 생성 (mkdir)
  2. ctr snapshot 옵션을 이용해서 생성한 임시 디렉토리를 컨테인너와 마운트 (ctr snapshot mount)
  3. 후에 마운트 된 디렉토리에 파일을 복사해서 컨테이너 안에서 그 파일을 확인 (kubectl exec)
  4. 완료 후에는 경로 마운트 해제(umoun)
  5. 마운트를 해제한 후에도 컨테이너 안에는 복사된 파일이 존재
### 이미지명 등을 이용하여 복사하려는 컨테이너의 id 확인
sudo ctr -n k8s.io c list | grep 이미지명
 
### ctr snapshot 명령으로 컨테이어와의 마운트 설정
sudo ctr -n k8s.io snapshot mounts <마운트물리경로> 컨테이너ID | xargs sudo
 
### rsync 명령으로 마운트 경로에 파일 복사
rsync -av <복사할파일의물리경로> <마운트물리경로>
 
### 마운트 해제
umount /tmp/mymount

컨테이너 안에 파일을 복사하기 위한 내용을 정리하면 다음과 같다.

1) 컨테이너 런타임으로 docker 를 사용하는 경우
-> 컨테이너가 구동되어 있는 노드에서 docker cp 명령을 사용

2) 컨테이너 런타임으로 container 를 사용하는 경우
-> ctr snapshot mount 명령을 사용 (본 포스팅 내용)

*2-1) 런타임으로 containerd를 사용 + k8s 클러스터 + 컨테이너 이미지에 tar 포함
->  kubectl cp 를 사용

 

경량 이미지가 아닌 대부분의 경우 tar 바이너리가 있으므로 2-1 번을 주로 사용하도록 하자.

댓글