Skopeo는 서로 다른 유형의 컨테이너 저장소 간에 컨테이너 이미지를 이동하는 도구입니다. docker.io, quay.io와 같은 컨테이너 레지스트리와 내부 컨테이너 레지스트리 또는 로컬 시스템의 다른 유형의 스토리지 간에 컨테이너 이미지를 복사할 수 있습니다. 로컬 컨테이너/스토리지 리포지토리에 복사하거나 Docker 데몬에 직접 복사할 수도 있습니다.
Skopeo의 가장 좋은 점 중 하나는 실행하기 위해 루트 권한이 필요하지 않으며 한 컨테이너 레지스트리에서 다른 컨테이너 레지스트리로 복사하는 경우 이미지를 로컬에 저장할 필요가 없다는 것입니다. Skopeo는 작업을 수행하기 위해 데몬을 실행할 필요가 없습니다.$ podman pull IMAGE; podman push IMAGE
를 실행하는 것보다 훨씬 더 나은 솔루션이라고 생각합니다.
Skopeo는 컨테이너 이미지를 옮기기 위해 전 세계적으로 사용되고 있습니다. CI/CD 시스템에서 컨테이너 레지스트리를 최신 상태로 유지하고 모든 종류의 컨테이너 서버에 컨테이너 스토리지를 로드하는 데 사용됩니다.
Skopeo는 원래 Red Hat의 Antonio Murdaca가 컨테이너 레지스트리에 저장된 컨테이너 이미지 JSON 파일을 보기 시작한 사이드 프로젝트였습니다. 컨테이너 이미지는 OCI(Open Container Initiative) 이미지든 Docker 이미지든 두 부분으로 구성됩니다. 한 부분은 rootfs
디렉토리의 tarball(TAR Archive)입니다. Linux 운영 체제에서 루트 파일 시스템처럼 보이는 경향이 있는 이 디렉토리에는 응용 프로그램을 실행하는 데 필요한 모든 코드와 구성 파일이 들어 있습니다.
두 번째 부분은 애플리케이션을 설명하는 JSON 파일입니다. 이 파일은 컨테이너 이미지 개발자가 입력한 내용으로, 컨테이너가 어떻게 실행될 것으로 예상하는지 내용을 담고 있습니다. 여기에는 컨테이너를 시작하기 위한 실행 파일의 경로를 설명하는 진입점 및 cmd가 포함됩니다. 또한 환경 변수 및 작업 디렉토리와 같은 내용을 포함합니다. 기본적으로 사람들이 Dockerfile 정의에서 볼 수 있는 모든 추가적인 필드입니다. 이러한 필드는 OCI 이미지 사양의 일부로 표준화되지 않았습니다.
이러한 이미지 tarball은 매우 커질 수 있으며(저는 수십 기가바이트에 이르는 이미지를 본 경우도 있습니다), 문제는 이미지 세부 명세인 JSON 파일을 보려면 docker pull IMAGE; docker inspect IMAGE
명령어를 수행하는 방법 뿐이었습니다. 몇 년 전 Red Hat은 업스트림 Docker 프로젝트와 함께 docker inspect --remote IMAGE
를 수행하기 위해 pull request을 열었지만 해당 요청은 거부당했습니다. Docker 프로젝트의 메인터넌스 관리자가 Docker CLI를 복잡하게 만드는 것을 원하지 않았기 때문입니다. 그러나 그 과정에서 Docker 메인터넌스 관리자로부터 컨테이너 레지스트리는 웹 서버일 뿐이며, JSON 파일을 풀다운하는 자체 도구를 빌드해야 한다
라는 이야기를 들었습니다. Antonio는 그 도구를 만들고 원격으로 보기(remote viewing)를 뜻하는 그리스어인 Skopeo라고 불렀습니다.
Antonio는 이미지 명세를 가져오려면 이미지를 pull해서 가져오는 것이 좋을 것이라고 생각했습니다. 일단 이미지를 가져오면 이미지를 푸시할 수 있다고 생각했고, 이런 관점에서 Skopeo는 다양한 유형의 컨테이너 스토리지 간에 컨테이너 이미지를 복사할 수 있는 도구로 개발했습니다.
Red Hat은 CoreOS와 회사가 합병되기 전부터 함께 작업하고 있었고, CoreOS는 Skopeo를 사용하여 컨테이너 엔진 rkt와 함께 사용하기 위해 호스트에 이미지를 복사하기를 원했습니다. 그러나 CoreOS 개발자는 Skopeo를 실행하기를 원하지 않았고 golang 라이브러리를 호출하기를 원했습니다. 이로 인해 Skopeo를 CLI 도구와 별도의 라이브러리인 github.com/containers/image로 분할하게 되었습니다. 이 라이브러리는 현재 Podman, Buildah, CRI-O를 포함한 다른 많은 컨테이너 엔진에서 공유됩니다.
$ skopeo --help
Various operations with container images and container image registries
Usage:
skopeo [command]
Available Commands:
copy Copy an IMAGE-NAME from one location to another
delete Delete image IMAGE-NAME
help Help about any command
inspect Inspect image IMAGE-NAME
list-tags List tags in the transport/repository specified by the REPOSITORY-NAME
login Login to a container registry
logout Logout of a container registry
manifest-digest Compute a manifest digest of a file
standalone-sign Create a signature using local files
standalone-verify Verify a signature using local files
sync Synchronize one or more images from one location to another
Skopeo는 다음 이미지 및 저장소 유형에서 작동합니다.
컨테이너 레지스트리
"Docker Registry HTTP API V2"를 구현하는 레지스트리의 이미지. docker://docker-reference. 인증 상태는 $XDG_RUNTIME_DIR/containers/auth.json
에 저장되며, skopeo 로그인을 사용하여 설정됩니다.
컨테이너 보관
로컬 컨테이너/스토리지 이미지 저장소에 있는 이미지. /etc/containers/storage.conf
에 지정된 위치 및 이미지 저장소.
로컬 파일 시스템
매니페스트, 레이어 tarball 및 서명을 개별 파일로 저장하는 기존 로컬 디렉토리 경로. 이것은 비표준화된 형식으로 주로 디버깅 또는 국소적인(invasive) 컨테이너 검사에 유용합니다.
도커 아카이브
이미지는 docker save 형식의 파일에 저장됩니다. docker-reference는 그러한 파일을 생성할 때만 사용되며 다이제스트를 포함하지 않아야 합니다.
도커 데몬
도커 데몬 내부 저장소에 저장된 이미지 docker-reference입니다. docker-reference는 태그나 다이제스트를 포함해야 합니다. 또는 이미지를 읽을 때 형식이 docker-daemon:algo:digest(이미지 ID)일 수도 있습니다.
OCI 형식의 로컬 디렉토리
경로에서 Open Container Image Layout Specification을 준수하는 디렉토리의 이미지 태그입니다.
저장소 세부 정보 확인
Example:
$ skopeo inspect --config docker://quay.io/podman/stable | json_pp
{
"architecture" : "amd64",
"config" : {
"Cmd" : [
"/bin/bash"
],
"Env" : [
"DISTTAG=f32container",
"FGC=f32",
"container=oci",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"_CONTAINERS_USERNS_CONFIGURED="
],
"Labels" : {
"license" : "MIT",
"name" : "fedora",
"vendor" : "Fedora Project",
"version" : "32"
}
},
"created" : "2020-05-03T12:27:03.990489916Z",
"history" : [
...
],
"os" : "linux",
"rootfs" : {
"diff_ids" : [
"sha256:a4c0fa2b217d3fd63d51e55a6fd59432e543d499c0df2b1acd48fbe424f2ddd1",
"sha256:120e15c4fd15cb42f0fc028a5105f3923b928c3cb766afc6cbc2c14a78b49387",
"sha256:f100a96598ff0e42eede39a8cd57ff85c3478f942074216572b01d1d614fc083",
"sha256:dbb194061737e6970cc735cee0b2353d541f51fe12a69cffb3827cce4cdf5c25",
"sha256:8dc1236d8bfbd7be7b8bf04677f5dd20fa41bbe6bd98688408071b1d4ec3ecf7"
],
"type" : "layers"
}
}
이미지 복사
Example:
$ skopeo copy docker://registry.access.redhat.com/ubi8-init docker://reg.company.com/ubi-init
Getting image source signatures
Copying blob 58e1deb9693d done
Copying blob f544909c6b5a done
Copying blob 78afc5364ad2 done
Copying config a858c9c7ea done
Writing manifest to image destination
Storing signatures
a858c9c7ea130b17bad01c858a20f4392085bcc0f25aa5eeee4b16726bed5bab
$ skopeo copy docker://registry.fedoraproject.org/fedora:latest containers-storage:fedora
Getting image source signatures
Copying blob 3088721d7dbf done
Copying config d81c91deec done
Writing manifest to image destination
Storing signatures
저장소에서 이미지 삭제
Example:
$ skopeo delete docker://localhost:5000/imagename:latest
Skopeo는 사용자와 관리자가 컨테이너 이미지 인프라를 유지 관리하는 데 도움이 되는 훌륭한 경량 도구입니다. 비록 초기에 마땅히 받아야 할 관심을 받지는 못했지만, Skopeo는 여러분의 도구 상자에 포함시킬 수 있는 정말 훌륭한 도구입니다.
이제 업스트림 릴리스를 사용할 수 있으며 Red Hat Enterprise Linux 8.3이상의 릴리스부터 Skopeo를 확인 할 수 있습니다.