【问题标题】:Is it possible to customize docker image generated with Spring Native (with buildpack)是否可以自定义使用 Spring Native 生成​​的 docker 镜像(使用 buildpack)
【发布时间】:2021-11-25 13:24:03
【问题描述】:

我目前正在开发一个 Spring Native 应用程序,它使用 paketo buildpack 构建并生成一个 Docker 映像。 我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。

另外,目前生成的容器镜像是安装在本地的,是否可以直接发送到另一个 Docker repo 中?

【问题讨论】:

    标签: buildpack graalvm-native-image spring-native


    【解决方案1】:

    我目前正在开发一个 Spring Native 应用程序,它使用 paketo buildpack 构建并生成一个 Docker 映像。我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。

    有几个选项:

    1. 您可以自定义您使用的基本映像(称为堆栈)。
    2. 您可以添加额外的构建包,这些构建包将在构建期间执行更多自定义。

    如果有一个 buildpack 可以提供您需要的功能,那么#2 显然更容易。我相信DataDog has a buildpack 虽然我不知道它的状态(工作/不工作/正在更新/等)。

    这需要更多的工作,但如果您希望添加特定功能,也可以创建一个 buildpack。如果您有一个需要该功能的应用程序,我不建议您这样做,但如果您有很多应用程序,则值得付出努力。

    我的一位同事将这个basic sample buildpack 放在一起,它安装并配置了一个虚构的 APM 代理。这是此场景的一个非常简洁的示例。

    #1 也是可能的。你可以create your own base image and stack。这个过程并不难,特别是如果您基于定期更新的知名且受信任的映像。

    这两个选项更难的是您需要让它们保持最新。这需要一些 CI 来监视软件更新并发布您的 buildpack 或堆栈的新版本。如果您不能对此做出承诺,那么两者都是一个坏主意,因为您的自定义设置将过时并可能导致未来的安全问题。

    更新

    1. 您可以将依赖项与您的应用程序捆绑在一起。如果您需要包含静态二进制文件(可能是您从应用程序调用的 cli),则此选项非常适用。

      在这种情况下,您只需在项目中创建一个名为 binaries/ 的文件夹(或任何您想要的文件夹)并将静态二进制文件放入其中(确保下载与您正在使用的容器映像兼容的版本,在我写这篇文章时,Paketo 是 Ubuntu Bionic)。然后,当您从应用程序调用 cli 命令时,只需使用它们的完整路径即可。那将是/workspace/binaries/workspace/<path to binaries in your project>

    2. 您可以使用apt buildpack 来安装带有apt 的软件包。这是一个通用的 buildpack,你提供了一个 apt 包列表,它会安装它们。

      这在某些情况下可以工作,但主要缺点是 buildpack 不以 root 身份运行,因此此 buildpack 无法将这些软件包安装到它们的标准位置。它试图通过设置环境变量(如PATHLD_LIBRARY_PATH 等)来解决此问题,以帮助其他应用程序找到已安装的包。

      这在大多数情况下都可以正常工作,但您可能会遇到应用程序无法找到您使用 apt buildpack 安装的内容的情况。如果您在尝试此方法时遇到问题,请注意。

    更新结束

    不管怎样,这是一种常见的情况,处理起来有点痛苦。幸运的是,an RFC 应该会让这个过程在未来变得更容易。

    另外,目前生成的容器镜像是安装在本地的,是否可以直接发送到另一个 Docker repo 中?

    您可以docker push 它,也可以将--publish 标志添加到pack build,它会将图像发送到您告诉它使用的任何注册表。

    https://stackoverflow.com/a/28349540/1585136

    发布标志的工作方式相同,您需要将图像命名为[REGISTRYHOST/][USERNAME/]NAME[:TAG]

    【讨论】:

    • 非常感谢您的回答。选项 #2 似乎确实是最简单的,但很高兴了解所有这些自定义选项
    • 仅供参考,我添加了几个想到的选项。
    • 谢谢丹尼尔
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2021-05-30
    相关资源
    最近更新 更多