是否可以自定义使用 Spring Native(使用 buildpack)生成的 docker 镜像

Jér*_*ury 6 buildpack graalvm-native-image spring-native

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

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

Dan*_*usa 11

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

这适用于 Spring Boot 应用程序,但实际上也适用于您可以使用构建包构建的任何其他应用程序。

有几种选择:

  1. 您可以自定义您使用的基础映像(称为堆栈)。
  2. 您可以添加其他构建包,这些构建包将在构建过程中执行更多自定义操作。

如果有一个构建包提供您所需的功能,#2 显然会更容易。具体到 Datadog,Paketo buildpack 现在有一个Datadog Buildpack,您可以将其与 Java 和 Node.js 应用程序一起使用

这需要更多工作,但如果您想添加特定功能,也可以创建构建包。如果您有一个应用程序需要该功能,我不会推荐这样做,但如果您有很多应用程序,那么这一努力是值得的。

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

#1也是可能的。您可以创建自己的基础映像和堆栈。这个过程并不难,特别是如果您将其基于定期更新的知名且值得信赖的映像。Paketo 团队还提供了jam create-stack可用于简化流程的命令。

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

更新

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

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

  2. 您可以使用apt buildpack通过 apt 安装软件包。这是一个通用构建包,您向其中提供 apt 软件包列表,它将安装它们。

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

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

更新结束

无论如何,这是一个常见的场景,解决起来有点痛苦。幸运的是,有一个 RFC可以使将来的过程变得更容易。

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

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

/sf/answers/1984467831/

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


归档时间:

查看次数:

3344 次

最近记录:

2 年 前