【问题标题】:Docker multi stage builds, Kubernetes, and Distroless compatibilityDocker 多阶段构建、Kubernetes 和 Distroless 兼容性
【发布时间】:2018-09-19 17:57:59
【问题描述】:

在将基于 distroless 的容器与 kubernetess 1.10 一起使用时,我遇到了“理论上的”兼容性问题。

实际上,distroless 需要 docker 17.5 (https://github.com/GoogleContainerTools/distroless) 而 kubernetes 只支持 17.03 版本 (https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#external-dependencies)

  1. 是否可以在 kubernetes 1.10 中运行 distroless 容器 集群没有任何问题?
  2. 是否可以构建基于 distroless 的 运行 docker 17.05 的构建服务器上的图像,然后将其部署在 Kubernetes 1.10 集群(docker 17.03)?

【问题讨论】:

  • 我将 kubernetes 支持读作“我们针对 17.03 进行测试”,不一定知道它不适用于其他 17.x 版本。也就是说,像你一样,我正在寻找可以确认他们在 17.05+ 上使用 distroless 的人

标签: docker kubernetes


【解决方案1】:

17.05 的要求是使用 multistage Dockerfile 使用 docker build 构建“无发行版”映像。当你构建了一个镜像后,没有什么可以阻止它在旧的 Docker/containerd 版本上运行。

Docker 通过使用 FROM: scratch 并留给图像作者来填充软件需要的任何内容,已经支持多年没有分发的图像,在某些情况下,像完全静态的二进制文件可能只是软件的二进制文件,什么都没有更多:)

【讨论】:

    【解决方案2】:

    您可能只需要 Docker 17.05+ 来使用多阶段文件构建映像。
    使用多阶段 Dockerfile 构建镜像后,它将与注册表中的镜像相同,就像您以老式方式构建它一样。

    取自Use multi-stage builds

    对于多阶段构建,您可以在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础,并且它们中的每一个都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的所有内容。

    最终结果是与以前相同的微小生产图像,但复杂性显着降低。

    Kubernetes 不使用 Dockerfiles 来创建 pod。它使用准备好运行来自 Docker 注册表的图像。

    这就是为什么我相信您可以在 Kubernetes Pod 中毫无问题地使用此类映像。

    但无论如何,要创建和推送你的镜像,你必须使用 Docker 17.05+ 的构建机器,它可以在 Dockerfile 中使用新的多阶段语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多