目錄

Skopeo: 管理 Container 映像檔及倉庫的方式

前言

平常要用什麼 Image,就是直接從 Docker Hub 拉下來就好了。但如果公司的環境不能連外呢?那就得自己架個 Registry,把要用的 Images 搬進去。

如果每次都先 pull、改 tag、再 push,也是有點麻煩。用 Skopeo 就可以省掉這些步驟,直接在 Registry 之間複製 Images。

簡介 Skopeo

Skopeo 是操作 Container Images 與 Registry 的開源工具,可以直接複製或查詢遠端 Images,不必先 docker pull,也不需要 Docker daemon。

常用功能有三個:

  • Copy:把 Images 從一個 Registry 搬到另一個,例如 Quay。
  • Inspect:不下載整個 Image,就能查看 Metadata。
  • Delete:刪除遠端 Image。

delete 要小心:即使指定 tag,目前也會依 digest 刪除 manifest,可能影響共用該 manifest 的其他 tags。Registry 必須允許刪除,空間回收則由 Garbage Collection 處理。

Day 2 Operation 探討

1. 如何從 Docker Hub 複製 Images 到自家的倉庫去?

先登入自己的 Registry,再複製 Images:

1
2
3
4
5
skopeo login --username divazone quay.divazone.local

skopeo copy --all \
    docker://docker.io/library/nginx:latest \
    docker://quay.divazone.local/divazone/nginx:latest
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Copying blob sha256:802b00ed6f79f48e6a5f44ecbcaf43563d6077aaecb565eee1dfc615c0b18c00
 21.44 MB / 21.44 MB [=====================================================] 20s
Copying blob sha256:e9d0e0ea682bf3ccff3215d4fd1f577403b7d6ca05a9ea34a85fde6eda92e7b6
 21.16 MB / 21.16 MB [=====================================================] 14s
Copying blob sha256:d8b7092b92215f6d5ed0a1c78928bb0b8e651948b15b30b71983bfb267725c72
 204 B / 204 B [============================================================] 5s
Copying config sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262
 5.88 KB / 5.88 KB [========================================================] 5s
Writing manifest to image destination
Writing manifest to image destination
Storing signatures

--all 會連同 manifest list / OCI index 複製該 tag 的所有平台映像;不加就只複製符合本機平台的版本。它不會複製所有 tags,要批次同步可用 skopeo sync。

這裡用 latest 示範,正式使用可改成指定版本或 digest。

執行指令的主機要能連到兩邊的 Registry。完全隔離時,先用 oci: 或 oci-archive: 匯出,再搬進內網匯入。

2. 如何從 Docker Hub 複製 Private Images 到自家的倉庫去?

加個 --src-creds 'divazone:PASSWORD_OR_TOKEN' 就好。也可以像下面這樣先登入 Docker Hub:

1
2
3
4
5
skopeo login --username divazone docker.io

skopeo copy --all \
    docker://docker.io/divazone/secret:latest \
    docker://quay.divazone.local/divazone/secret:latest

3. 如何從本機 Docker 複製到某個 Repos 去?

本機已經有 nginx:latest 的話,可以直接從 Docker 搬出去:

1
2
3
skopeo copy \
    docker-daemon:nginx:latest \
    docker://quay.divazone.local/divazone/nginx:latest

docker-daemon: 需要 Docker daemon 正在執行,而且使用者有存取權限。它只複製本機已有的映像,不會補齊其他平台。Podman / Buildah / CRI-O 的本機儲存則使用 containers-storage:。

4. 如何審視 (Inspect) Image Metadata?

1
skopeo inspect docker://docker.io/library/nginx:latest
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
    "Name": "docker.io/library/nginx",
    "Digest": "sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3",
    "RepoTags": [
        "1-alpine-perl",
        "1-alpine",
        "1-perl",
        "1.10-alpine",
        "1.10.0-alpine",
        "1.10.0",
        ...
    ],
    ...
}

輸出的架構資訊對應本機平台。要看原始 manifest,或多架構映像的 manifest list / OCI index,加上 --raw:

1
skopeo inspect --raw docker://docker.io/library/nginx:latest

5. 複製這件事沒有 Skopeo 之前是怎麼做的?

先 pull 到本機,重新 tag,再 push:

1
2
3
4
docker login --username divazone quay.divazone.local
docker pull docker.io/library/nginx:latest
docker tag docker.io/library/nginx:latest quay.divazone.local/divazone/nginx:latest
docker push quay.divazone.local/divazone/nginx:latest

這個流程預設只搬本機平台,不等同於 skopeo copy --all。Docker CLI 也需要另外登入。

References