使用 docker 或其他工具从图像存储库中获取单层?

Fetch single layer from image repository using docker or other tooling?

我们的构建创建了临时图像,我们将其存储到存储库中以用于缓存目的,因为后续图像依赖于它们。

之后图像未标记。我可以从构建日志中获取的层 ID。

但由于它们可能在某些层中包含凭据(通过“ENV API_KEY=$API_KEY 在 Dockerfile 中设置)我只想获取这些层并确保没有人可以提取凭据.

有没有简单的方法?

我不确定您实际上是在引用整个图像 ID 还是单层 ID。通常你也应该看到图像的完整摘要。使用整个图像摘要,您可以执行以下操作。如果您不知道配置文件层的特定层,也可以针对单层完成最后的步骤。

但一般来说,这取决于清单架构版本。使用模式版本 1,您可以在清单上看到环境变量。对于模式版本 2,它是两步过程。示例基于 Docker Hub 注册表,但在其他地方也应用了相同的 API。

这两种情况,首先都需要authentication token,可以获取:

curl -sSL "https://auth.docker.io/token?service=registry.docker.io&scope=repository:<repository>:pull" > auth.json

然后在版本 1 架构中拉取清单并获取包含环境变量的历史部分:

curl --request GET -sLH "Authorization: Bearer `jq -r '.token' auth.json`" -H "Accept: application/vnd.docker.distribution.manifest.v1+json”" "https://index.docker.io/v2/<repository>/manifests/latest" | jq ".history"

Manifest v2 架构使用不同的 Accept header,现在得到更多支持并提供更多信息:

curl --request GET -sLH "Authorization: Bearer `jq -r '.token' auth.json`" -H "Accept: application/vnd.docker.distribution.manifest.v2+json" "https://index.docker.io/v2/<repository>/manifests/latest"

响应时有配置部分:

"config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": 5802,
      "digest": "sha256:2ff217b387d7bbc0ad3fb1cbb2cdae9f7e562f26065f847a1b69964fcb71108"
   }

最后下载整个 blob:

curl --request GET -LOH "Authorization: Bearer `jq -r '.token' auth.json`" "https://index.docker.io/v2/<repository>/blobs/sha256:2ff217b387d7bbc0ad3fb1cbb2cdae9f7e562f26065f847a1b69964fcb71108"

查看包含历史记录的环境变量的整个配置文件的内容:

jq . sha256:2ff217b387d7bbc0ad3fb1cbb2cdae9f7e562f26065f847a1b69964fcb71108