我目前正在开发一个 Spring Native 应用程序,它使用 paketo buildpack 进行构建并生成 Docker 映像。我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。
这适用于 Spring Boot 应用程序,但实际上也适用于您可以使用构建包构建的任何其他应用程序。
有几种选择:
- 您可以自定义您使用的基础映像(称为堆栈)。
- 您可以添加其他构建包,这些构建包将在构建过程中执行更多自定义操作。
如果有一个构建包提供您所需的功能,#2 显然会更容易。具体到 Datadog,Paketo 构建包现在有一个您可以将 Datadog Buildpack 与 Java 和 Node.js 应用程序一起使用 https://github.com/paketo-buildpacks/datadog.
这需要更多工作,但如果您想添加特定功能,也可以创建构建包。如果您有一个应用程序需要该功能,我不会推荐这样做,但如果您有很多应用程序,那么这一努力是值得的。
我的一位同事这样说基本示例构建包 https://github.com/pivotal-david-osullivan/tanzu-noop-apm一起安装和配置虚构的 APM 代理。这是此场景的一个非常简洁的示例。
#1也是可能的。你可以创建您自己的基础镜像和堆栈 https://buildpacks.io/docs/operator-guide/create-a-stack/。这个过程并不难,特别是如果您将其基于定期更新的知名且值得信赖的映像。 Paketo 团队还拥有jam create-stack https://github.com/paketo-buildpacks/jam您可以使用该命令来简化流程。
这两个选项更困难的是您需要使它们保持最新状态。这需要一些 CI 来监视软件更新并发布构建包或堆栈的新版本。如果您不能承诺这一点,那么两者都是一个坏主意,因为您的自定义将过时并可能导致未来的安全问题。
UPDATE
-
您可以将依赖项与您的应用程序捆绑在一起。如果您需要包含静态二进制文件(也许是从应用程序调用的 cli),则此选项非常有效。
在这种情况下,您只需在项目中创建一个名为binaries/
(或者任何你想要的)并将静态二进制文件放在那里(确保下载与你正在使用的容器镜像兼容的版本,在我写这篇文章时 Paketo 是 Ubuntu Bionic)。然后,当您从应用程序调用 cli 命令时,只需使用它们的完整路径即可。那将是/workspace/binaries
or /workspace/<path to binaries in your project>
.
-
您可以使用apt 构建包 https://github.com/fagiani/apt-buildpack使用 apt 安装软件包。这是一个通用构建包,您向其中提供 apt 软件包列表,它将安装它们。
这在某些情况下可以工作,但主要缺点是 buildpack 不能以 root 身份运行,因此此 buildpack 无法将这些包安装到其标准位置。它尝试通过设置环境变量来解决这个问题,例如PATH
, LD_LIBRARY_PATH
等帮助其他应用程序找到已安装的软件包。
这在大多数情况下都可以正常工作,但您可能会遇到应用程序无法找到使用 apt buildpack 安装的内容的情况。如果您在尝试此方法时发现问题,则值得注意。
更新结束
无论如何,这是一个常见的场景,解决起来有点痛苦。幸运的是,有an RFC https://github.com/buildpacks/rfcs/pull/173这应该会使未来的过程变得更容易。
另外,目前生成的容器镜像已安装在本地,是否可以直接将其发送到另一个 Docker 存储库中?
You can docker push
或者你可以添加--publish
标记为pack build
它会将图像发送到您告诉它使用的任何注册表。
https://stackoverflow.com/a/28349540/1585136 https://stackoverflow.com/a/28349540/1585136
发布标志的工作方式相同,您需要命名您的图像[REGISTRYHOST/][USERNAME/]NAME[:TAG]
.