我目前正在开发一个 Spring Native 应用程序,它正在使用 paketo buildpack 构建并生成一个 Docker 映像。我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。
另外,现在生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送它?
我目前正在开发一个 Spring Native 应用程序,它正在使用 paketo buildpack 构建并生成一个 Docker 映像。我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。
另外,现在生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送它?
我目前正在开发一个 Spring Native 应用程序,它正在使用 paketo buildpack 构建并生成一个 Docker 映像。我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 映像。
有几个选项:
如果有提供您需要的功能的 buildpack,#2 显然更容易。我相信DataDog 有一个 buildpack,虽然我不知道它的状态(工作/不工作/正在更新/等)。
这是更多的工作,但如果您希望添加特定功能,也可以创建一个 buildpack。如果您有一个需要该功能的应用程序,我不建议您这样做,但如果您有很多应用程序,则值得付出努力。
我的一位同事将这个基本示例 buildpack放在一起,它安装和配置了一个虚构的 APM 代理。这是此场景的一个非常简洁的示例。
#1 也是可能的。您可以创建自己的基础映像和堆栈。这个过程并不难,特别是如果您基于定期更新的知名且受信任的映像。
这两种选择更难的是您需要使它们保持最新。这需要一些 CI 来监视软件更新并发布您的 buildpack 或堆栈的新版本。如果您不能对此做出承诺,那么两者都是一个坏主意,因为您的定制将过时并可能导致未来的安全问题。
更新
您可以将依赖项与您的应用程序捆绑在一起。如果您有需要包含的静态二进制文件(可能是您从应用程序调用的 cli),则此选项非常有效。
在这种情况下,您只需在项目中创建一个名为binaries/
(或任何您想要的文件夹)并将静态二进制文件放入其中(确保下载与您正在使用的容器映像兼容的版本,Paketo 是 Ubuntu Bionic 在时间我写这个)。然后,当您从应用程序调用 cli 命令时,只需使用它们的完整路径即可。那将是/workspace/binaries
或/workspace/<path to binaries in your project>
。
您可以使用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]
。