首页 > 解决方案 > 是否可以自定义使用 Spring Native 生成​​的 docker 镜像(使用 buildpack)

问题描述

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

另外,现在生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送它?

标签: buildpackgraalvm-native-imagespring-native

解决方案


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

有几个选项:

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

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

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

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

#1 也是可能的。您可以创建自己的基础映像和堆栈。这个过程并不难,特别是如果您基于定期更新的知名且受信任的映像。

这两种选择更难的是您需要使它们保持最新。这需要一些 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 无法将这些包安装到它们的标准位置。PATH它试图通过设置环境变量(如,等)来解决此问题LD_LIBRARY_PATH,以帮助其他应用程序找到已安装的包。

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

更新结束

对于它的价值,这是一个常见的情况,工作起来有点痛苦。幸运的是,有一个 RFC可以让这个过程在未来变得更容易。

另外,现在生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送它?

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

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

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


推荐阅读