google/go-containerregistry

GitHub: google/go-containerregistry

Google 开源的 Go 语言容器镜像操作库与命令行工具,支持从多种源读取、修改和写入 OCI 镜像,无需 Docker 守护进程即可完成镜像拉取、推送、复制和变更。

Stars: 3772 | Forks: 626

# go-containerregistry [![GitHub Actions Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b1fa06a68a165239.svg)](https://github.com/google/go-containerregistry/actions?query=workflow%3ABuild) [![GoDoc](https://godoc.org/github.com/google/go-containerregistry?status.svg)](https://godoc.org/github.com/google/go-containerregistry) [![Code Coverage](https://codecov.io/gh/google/go-containerregistry/branch/main/graph/badge.svg)](https://codecov.io/gh/google/go-containerregistry) ## 简介 (Introduction) 这是一个用于与容器镜像仓库交互的 Golang 库。 它在很大程度上基于[同名 Python 库](https://github.com/google/containerregistry)。 下图展示了该库处理的主要类型。 ![OCI image representation](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/a071cc41ad165251.jpg) ## 理念 该库的总体设计理念是定义接口,以呈现资源的不可变视图(例如 [`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, 子域名突变, 安全防御评估, 容器化, 容器注册表, 容器镜像, 库文件, 文档安全, 日志审计, 程序破解, 镜像拉取, 镜像推送, 镜像操作, 镜像构建, 镜像管理