google/go-containerregistry
GitHub: google/go-containerregistry
Google 开源的 Go 语言容器镜像操作库与命令行工具,支持从多种源读取、修改和写入 OCI 镜像,无需 Docker 守护进程即可完成镜像拉取、推送、复制和变更。
Stars: 3772 | Forks: 626
# go-containerregistry
[](https://github.com/google/go-containerregistry/actions?query=workflow%3ABuild)
[](https://godoc.org/github.com/google/go-containerregistry)
[](https://codecov.io/gh/google/go-containerregistry)
## 简介 (Introduction)
这是一个用于与容器镜像仓库交互的 Golang 库。
它在很大程度上基于[同名 Python 库](https://github.com/google/containerregistry)。
下图展示了该库处理的主要类型。

## 理念
该库的总体设计理念是定义接口,以呈现资源的不可变视图(例如 [`Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1#Image)、
[`Layer`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1#Layer)、
[`ImageIndex`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1#ImageIndex)),
这些视图可以由多种媒介支持(例如 [registry](./pkg/v1/remote/README.md)、
[tarball](./pkg/v1/tarball/README.md), [daemon](./pkg/v1/daemon/README.md), ...)。
为了补充这些不可变视图,我们支持生成新不可变视图的函数式变更
(例如 [mutate](./pkg/v1/mutate/README.md))。最终目标是提供一组
通用的原语,可以组合起来高效、轻松地完成极其强大的任务。
资源视图和变更都可能是延迟、急切或记忆化等,并且大多数都根据
我们在实际工具中看到的常见路径进行了优化(例如,将磁盘上的新镜像
作为压缩 tarball 写入 registry)。
### 实验
随着时间的推移,我们将在此处列出的实验性环境变量下添加新功能。
| 环境变量 | 值 | 作用 |
|---------|----------|--------------|
| `GGCR_EXPERIMENT_ESTARGZ` | `"1"` | ⚠️已弃用⚠️:启用此实验后,将指示 `tarball.LayerFromOpener` 生成与 [estargz](https://github.com/opencontainers/image-spec/issues/815) 兼容的层,从而允许经过适当配置的 containerd 对其进行延迟加载。 |
### `v1.Image`
#### 源
* [`remote.Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#Image)
* [`tarball.Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/tarball#Image)
* [`daemon.Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/daemon#Image)
* [`layout.Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/layout#Path.Image)
* [`random.Image`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/random#Image)
#### 目标
* [`remote.Write`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#Write)
* [`tarball.Write`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/tarball#Write)
* [`daemon.Write`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/daemon#Write)
* [`legacy/tarball.Write`](https://godoc.org/github.com/google/go-containerregistry/pkg/legacy/tarball#Write)
* [`layout.AppendImage`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/layout#Path.AppendImage)
### `v1.ImageIndex`
#### 源
* [`remote.Index`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#Index)
* [`random.Index`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/random#Index)
* [`layout.ImageIndexFromPath`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/layout#ImageIndexFromPath)
#### 目标
* [`remote.WriteIndex`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#WriteIndex)
* [`layout.Write`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/layout#Write)
### `v1.Layer`
#### 源
* [`remote.Layer`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#Layer)
* [`tarball.LayerFromFile`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/tarball#LayerFromFile)
* [`random.Layer`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/random#Layer)
* [`stream.Layer`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/stream#Layer)
#### 目标
* [`remote.WriteLayer`](https://godoc.org/github.com/google/go-containerregistry/pkg/v1/remote#WriteLayer)
## 概述
### `mutate`
这些库最简单的用法是从一个源读取并写入另一个源。
例如,
* `crane pull` 是 `remote.Image -> tarball.Write`,
* `crane push` 是 `tarball.Image -> remote.Write`,
* `crane cp` 是 `remote.Image -> remote.Write`。
然而,通常你实际上想要对镜像_进行一些更改_。
这就是 [`mutate`](pkg/v1/mutate) 包的用途,它暴露了一些
关于镜像的常用更改功能。
### `partial`
如果你尝试在库尚未支持的源或目标中使用此库,
可能会有些繁琐。`Image` 和 `Layer` 接口非常宽泛,包含大量
冗余信息。这在一定程度上是设计使然,因为我们希望在可能的
情况下尽可能高效地公开这些信息,但这对于自己实现来说确实
是一件痛苦的事情。
[`partial`](pkg/v1/partial) 包的目的是让实现 `v1.Image`
变得更加容易,如果你实现了 `v1.Image` 的一个最小子集,
它会为你填充所有派生的访问器。
### `transport`
你可能认为我们的抽象很糟糕,只想向 registry 进行身份验证
并发送请求。
这就是 [`transport`](pkg/v1/remote/transport) 和 [`authn`](pkg/authn) 包的用途。
## 工具
此仓库托管了一些基于该库构建的工具。
### `crane`
[`crane`](cmd/crane/README.md) 是一个用于与远程镜像
和 registry 交互的工具。
### `gcrane`
[`gcrane`](cmd/gcrane/README.md) 是 `crane` 的一个 GCR 特定变体,
它为 `ls` 子命令提供了更丰富的输出,并支持一些基本的垃圾回收。
### `krane`
[`krane`](cmd/krane/README.md) 是 `crane` 的直接替代品,支持
常见的基于 Kubernetes 的工作负载身份机制,使用 [`k8schain`](#k8schain)
作为传统身份验证机制的后备方案。
### `k8schain`
[`k8schain`](pkg/authn/k8schain/README.md) 以易于被本库使用的
方式实现了 kubelet 使用的身份验证语义。
`k8schain` 不是一个独立的工具,但在此链接以提高可见度。
### 荣誉成员:[`ko`](https://github.com/google/ko)
该工具最初是在此仓库中开发的,但后来已移至其
自己的仓库。
标签:Docker, EVTX分析, Google开源, Go语言, NIDS, 子域名突变, 安全防御评估, 容器化, 容器注册表, 容器镜像, 库文件, 文档安全, 日志审计, 程序破解, 镜像拉取, 镜像推送, 镜像操作, 镜像构建, 镜像管理