专栏首页CNCF你知道你的Docker镜像里有什么吗?Buildpacks知道。

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

作者:Emily Casey

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

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

https://github.com/buildpack/pack

$ 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

$ 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。

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

$ 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通过将开发人员从诸如生成材料清单之类的关注点中分离出来,实现了易用性和可操作性之间的平衡。

本文分享自微信公众号 - CNCF(lf_cncf),作者:Buildpacks

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 克服清理容器镜像的挑战

    客座文章作者:Alexey Igrychevm,Flant的软件工程师。最初在Flant博客发表。

    CNCF
  • CNCF接纳Harbor为沙盒项目

    今天,云原生计算基金会(CNCF)将云原生镜像仓库项目Harbor引入CNCF的沙盒,沙盒是处在早期阶段的、进化中的云原生项目的主要基地。

    CNCF
  • 网研会:增强合规信心:使用Harbor进行高级镜像扫描(视频+PDF)

    Harbor是一个开源容器镜像注册表,可通过基于角色的访问控制来保护镜像、扫描镜像中的漏洞并将镜像标记为可信。Harbor是CNCF孵化项目,可提供出色的合规性...

    CNCF
  • 基于OpenStack和Docker设计的CI/CD

    目前,在Docker容器中部署和运行OpenStack云计算服务,已成为主流趋势之一。基于这样的背景,设计和实现OpenStack+Docker环境下的CI/C...

    Henry Zhang
  • 【漫画】容器技术docker应用场景解析

    话说小史已经接受了A厂的offer,这不,已经在公司附近租好了房子,准备搬家过去住了。

    乔戈里
  • Docker的Image

    同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TA...

    Criss@陈磊
  • docker创建私有仓库

    由于网速和大中华局域网效果,使得我们在DockerHub下载镜像的速度很慢,甚至一些国内的镜像仓库,也感觉速度不是很好。所以,很有必要在本地或者一个我们访问很快...

    古时的风筝
  • 腾讯云学生机成都新服2M1H1G只需1.02元

    Youngxj
  • Docker镜像超详细介绍

      首先我们来看看镜像到底是什么?虽然前面有介绍过镜像和容器 ,但也不是特别的深入。

    用户4919348
  • Debian云工具

    最近,我根据Ubuntu提供的标准开发了一套云工具,并将它们移植到了Debian系统中。下面让我们来看看如何在云端使用debian!

    huanghaibin33

扫码关注云+社区

领取腾讯云代金券