前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道你的Docker镜像里有什么吗?Buildpacks知道。

你知道你的Docker镜像里有什么吗?Buildpacks知道。

作者头像
CNCF
发布2019-12-04 15:36:51
1.1K0
发布2019-12-04 15:36:51
举报
文章被收录于专栏:CNCF

作者:Emily Casey

你不能修补一个你不知道你有的漏洞。这就是为什么了解Docker镜像中的内容是确保其安全性的第一步。幸运的是,任何使用Cloud Native Buildpacks构建的镜像都包含元数据,你不仅可以使用这些元数据来确定镜像包含什么,还可以确定每个层中包含什么以及如何创建镜像。

使用Pack CLI的pack build命令创建的任何镜像也可以用inspect-image命令检查,如下所示:

https://github.com/buildpack/pack

代码语言:javascript
复制
$ pack inspect-image ekcasey/myimage
Inspecting image: ekcasey/myimage
REMOTE:
Stack: io.buildpacks.stacks.bionic
Base Image:
  Reference: index.docker.io/cloudfoundry/run@sha256:8de6ef35195a6ebb4875cfb2ab5dfb4334c7bef85425318739a6c6bfc4edb202
  Top Layer: sha256:9335faa48c88fc9f7f831f86e41ba979fa402bc715671b11d63c4f3eb4f69458
…
Run Images:
  cloudfoundry/run:base-cnb
Buildpacks:
  ID                              VERSION
  org.cloudfoundry.openjdk        v1.0.48
  org.cloudfoundry.jvmapplication v1.0.66
  org.cloudfoundry.springboot     v1.0.88
LOCAL:
...

这个示例输出告诉我们,镜像是使用三个构建包(buildpack)构建的。它还告诉我们用于创建最终镜像的堆栈ID和运行镜像的标记。与此信息一起包含的是堆栈“顶层”的引用,你可以使用它将基础镜像与buildpack创建的层分隔开。

此信息是Pack用于执行其rebase命令的内容,其中buildpack创建的层用于创建具有更新堆栈的新镜像,而无需运行构建。

镜像上的元数据还包含关于每个层内部的信息。我们可以通过提供——bom选项来查看它,它为镜像发出一个材料清单。这些信息来自构建包创建的构建计划(build plan)。因为这些信息存储在镜像的配置层中,可以很容易地读取它们,而不必从注册表中提取整个镜像。

https://github.com/buildpack/spec/blob/master/buildpack.md#build-plan-toml

代码语言:javascript
复制
$ pack inspect-image ekcasey/myimage --bom | jq .remote
[
  {
  "buildpack": {
    "id": "org.cloudfoundry.openjdk",
    "version": "v1.0.48"
  },
  "metadata": {
    "licenses": [
      {
        "type": "GPL-2.0 WITH Classpath-exception-2.0",
        "uri": "https://openjdk.java.net/legal/gplv2+ce.html"
      }
    ],
    "name": "OpenJDK JRE",
    "sha256": "2f08c469c9a8adea1b6ee3444ba2a8242a7e99d87976a077faf037a9eb7f884b",
    "uri": "https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.5%2B10/OpenJDK11U-jre_x64_linux_hotspot_11.0.5_10.tar.gz"
    },
    "name": "openjdk-jre",
    "version": "11.0.5"
  },
  ...

在这个条目中,我们可以看到这个镜像包含OpenJDK JRE版本11.0.5。我们还可以看到与此JRE关联的许可证和从中提取的URI。

另一个示例材料清单条目包含的信息包括类路径和已安装的依赖项。

代码语言:javascript
复制
$ pack inspect-image ekcasey/myimage --bom | jq .remote
  ...
  {
    "buildpack": {
      "id": "org.cloudfoundry.springboot",
      "version": "v1.0.88"
    },
    "metadata": {
      "classes": "BOOT-INF/classes/",
      "classpath": [
        "/workspace/BOOT-INF/classes",
        "/workspace/BOOT-INF/lib/attoparser-2.0.5.RELEASE.jar",
        "/workspace/BOOT-INF/lib/classmate-1.4.0.jar",
        "/workspace/BOOT-INF/lib/hibernate-validator-6.0.18.Final.jar",
        "/workspace/BOOT-INF/lib/jackson-annotations-2.9.10.jar",
        ...
      ],
      "lib": "BOOT-INF/lib/",
      "start-class": "io.buildpacks.example.sample.SampleApplication",
      "version": "2.1.10.RELEASE"
    },
    "name": "spring-boot",
    "version": ""
  },
  ...

这些信息可以手工使用,或者更有可能与自动化一起使用,以确保遵从性、扫描易受攻击的依赖项,或者生成用于开放源码许可公开的文件。

Buildpacks使用结构化数据来报告镜像的确切内容,而不是依赖于从文件系统收集信息的外部工具。这使得它们非常适合具有严格遵从性或安全性需求的组织,而不会迫使开发人员在工具上做出妥协。Buildpacks通过将开发人员从诸如生成材料清单之类的关注点中分离出来,实现了易用性和可操作性之间的平衡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档