“分心”图像仅包含您的应用程序及其运行时依赖性。它们不包含您期望在标准Linux发行版中找到的包装管理人员,外壳或任何其他程序。
有关更多信息,请参阅此演讲(视频)。
自2023年3月以来,分散图像使用OCI清单,如果您看到错误引用application/vnd.oci.image.manifest.v1+json
或application/vnd.oci.image.index.v1+json
,请更新容器工具(Docker,docker,docker,docker,docker,docker,docker,docker ,,吉布等最新。
将运行时容器中的内容限制为应用程序所需的内容是Google和其他技术巨头使用的最佳实践,这些实践已多年使用。它改善了扫描仪(例如CVE)的噪音,并减轻了将出处建立的负担到您所需要的。
分散图像很小。最小的分散图像, gcr.io/distroless/static-debian12
distroless/static-debian12,约为2 MIB。这大约是alpine
大小(〜5 MIB)的50%,不到debian
(124 MIB)的2%。
这些图像是使用Bazel构建的,但也可以通过其他Docker Image Build Tooling使用。
当前由Distrools Project发布和更新以下图像(有关支持时间表,请参见Support_policy)
图像 | 标签 | 建筑后缀 |
---|---|---|
gcr.io/distroless/static-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/base-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/base-nossl-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/cc-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/python3-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64 |
gcr.io/distroless/java-base-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,S390X,PPC64LE |
gcr.io/distroless/java17-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,S390X,PPC64LE |
gcr.io/distroless/java21-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,PPC64LE |
gcr.io/distroless/nodejs18-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/nodejs20-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
gcr.io/distroless/nodejs22-debian12 | 最新的,非根本,调试,调试非根管 | AMD64,ARM64,ARM,S390X,PPC64LE |
这些图像是指带有所有受支持体系结构的图像索引。可以使用标签上的附加架构gcr.io/distroless/static-debian12:latest-amd64
直接引用体系结构的特定图像
任何其他标签都被视为弃用,不再更新
所有干扰图像均由Cosign签名,上面键(无钥匙) - 这是从2023年11月开始的唯一支持的机制。我们建议我们在构建图像之前验证您使用的任何干扰图像。您可以使用以下方式验证任何干扰图像的无钥匙签名
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
请注意,默认情况下,分散图像不包含外壳。这意味着必须以vector
形式指定DockerFile ENTRYPOINT
命令,以避免使用Shell的容器运行时。
这有效:
ENTRYPOINT ["myapp"]
但这无效:
ENTRYPOINT "myapp"
由于相同的原因,如果将入口点设置为空向量,则应以vector
形式指定CMD命令(请参见下面的示例)。请注意,默认情况下,静态,碱基和CC图像具有空的矢量入口点。包含语言运行时的图像具有特定语言的默认值(请参见:Java,Nodejs,Python3)。
Docker多阶段构建可以轻松使用分散图像。请按照以下步骤开始:
为您的应用程序堆栈选择正确的基本图像。
编写一个多阶段Docker文件。注意:这需要Docker 17.05或更高。
基本想法是,您将有一个阶段来构建应用程序工件,并将其插入您的运行时分散图像中。如果您想了解更多信息,请查看有关多阶段构建的文档。
这是一个快速的示例:
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
您可以在此处找到其他示例:
要运行任何示例,请转到语言目录并运行
docker build -t myapp .
docker run -t myapp
运行node.js express app node-express并公开容器的端口:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
这应该将Express申请暴露于您的本地主机:3000
有关如何使用Bazel生成容器图像的完整文档,请参见Bazel-Contrib/Rules_oci存储库。
有关如何使用基于GO的Debian软件包管理器(Current)生成Bazel配置的文档和示例,请参见./debian_package_manager,以获取文档和有关如何使用Bazel软件包管理器规则(未在此存储库中使用)的文档和示例,请参见。 /package_manager
示例可以在示例目录中的此存储库中找到。
我们有一些示例有关如何在 /示例目录中运行一些常见应用程序堆栈的示例。请参阅此处的:
有关如何完成图像中一些常见任务的示例,请参见此处:
有关这些图像的构建和释放的更多信息,请参见此处。
分散图像基于Debian 12(Bookworm)。图像用Debian版本后缀(例如-debian12
)明确标记。当前,指定没有分发图像的图像将选择-debian12
图像,但这将来会更改为较新版本的Debian。明确引用发行版,以防止在下一个Debian版本发布时进行破坏构建。
Distrooss跟踪上游Debian版本,使用GitHub操作在更新时自动生成拉请请求。
分散图像是最小的,缺乏贝壳访问。 :debug
映像提供了一个繁忙的盒外壳输入。
例如:
cd examples/python3/
编辑Dockerfile
将最终图像更改为:debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
然后使用Shell入口点构建和启动:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
注意:如果您正在使用的图像已经具有标签,例如
gcr.io/distroless/java17-debian12:nonroot
,请使用标签debug-<existing tag>
,例如gcr.io/distroless/java17-debian12:debug-nonroot
。
注意:基本图像中没有安装LDD,因为它是Shell脚本,您可以将其复制或下载。
如果您的项目使用干扰,请发送PR在此处添加您的项目!