是否可以自定义使用 Spring 本机生成的 docker 图像(使用 buildpack)
Is it possible to customize docker image generated with Spring Native (with buildpack)
我目前正在开发 Spring 本机应用程序,它正在使用 paketo buildpack 构建并生成 Docker 图像。
我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 图像。
此外,目前生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送?
I'm currently developping a Spring Native application, it's building using paketo buildpack and generating a Docker image. I was wondering if it's possible to customize the generated Docker image by adding third party tools (like a Datadog agent for example).
这适用于 Spring 引导应用程序,但实际上也适用于您可以使用构建包构建的任何其他应用程序。
有几个选项:
- 您可以自定义您使用的基础图像(称为堆栈)。
- 您可以添加额外的构建包,这将在构建期间执行更多自定义。
#2 如果有提供您需要的功能的构建包,显然会更容易。具体关于 Datadog,Paketo buildpack 现在有一个 Datadog Buildpack you can use with Java and Node.js apps.
工作量更大,但如果您希望添加特定功能,也可以创建构建包。如果您有一个应用程序需要该功能,我不会推荐此方法,但如果您有很多应用程序,那么这样做是值得的。
我的一个同事把这个 basic sample buildpack 放在一起,它安装并配置了一个虚构的 APM 代理。这是这种情况的一个非常简洁的例子。
#1也是可以的。您可以使用 create your own base image and stack. The process isn't that hard, especially if you base it on a well-known and trusted image that is getting regular updates. The Paketo team also has the jam create-stack
命令来简化流程。
这两个选项的难点在于您需要使它们保持最新状态。这需要一些 CI 来监视软件更新并发布构建包或堆栈的新版本。如果您不能做到这一点,那么两者都不是一个好主意,因为您的自定义将过时并可能导致安全问题。
更新
您可以将依赖项与您的应用程序捆绑在一起。如果您有需要包含的静态二进制文件,这个选项很有效,也许是您从应用程序调用的 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 安装的内容的情况。如果您在尝试此方法时发现问题,请注意。
更新结束
尽管如此,这是一个常见的场景,但处理起来有点痛苦。幸运的是,有 an RFC 可以使以后的过程更容易。
Also, for now the generated container image is installed locally, is it possible to send it directly in another Docker repo ?
您可以 docker push
它或者您可以将 --publish
标志添加到 pack build
,它会将图像发送到您告诉它使用的任何注册表。
发布标志的工作方式相同,您需要为图像命名 [REGISTRYHOST/][USERNAME/]NAME[:TAG]
。
我目前正在开发 Spring 本机应用程序,它正在使用 paketo buildpack 构建并生成 Docker 图像。 我想知道是否可以通过添加第三方工具(例如 Datadog 代理)来自定义生成的 Docker 图像。
此外,目前生成的容器镜像安装在本地,是否可以直接在另一个 Docker 存储库中发送?
I'm currently developping a Spring Native application, it's building using paketo buildpack and generating a Docker image. I was wondering if it's possible to customize the generated Docker image by adding third party tools (like a Datadog agent for example).
这适用于 Spring 引导应用程序,但实际上也适用于您可以使用构建包构建的任何其他应用程序。
有几个选项:
- 您可以自定义您使用的基础图像(称为堆栈)。
- 您可以添加额外的构建包,这将在构建期间执行更多自定义。
#2 如果有提供您需要的功能的构建包,显然会更容易。具体关于 Datadog,Paketo buildpack 现在有一个 Datadog Buildpack you can use with Java and Node.js apps.
工作量更大,但如果您希望添加特定功能,也可以创建构建包。如果您有一个应用程序需要该功能,我不会推荐此方法,但如果您有很多应用程序,那么这样做是值得的。
我的一个同事把这个 basic sample buildpack 放在一起,它安装并配置了一个虚构的 APM 代理。这是这种情况的一个非常简洁的例子。
#1也是可以的。您可以使用 create your own base image and stack. The process isn't that hard, especially if you base it on a well-known and trusted image that is getting regular updates. The Paketo team also has the jam create-stack
命令来简化流程。
这两个选项的难点在于您需要使它们保持最新状态。这需要一些 CI 来监视软件更新并发布构建包或堆栈的新版本。如果您不能做到这一点,那么两者都不是一个好主意,因为您的自定义将过时并可能导致安全问题。
更新
您可以将依赖项与您的应用程序捆绑在一起。如果您有需要包含的静态二进制文件,这个选项很有效,也许是您从应用程序调用的 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 安装的内容的情况。如果您在尝试此方法时发现问题,请注意。
更新结束
尽管如此,这是一个常见的场景,但处理起来有点痛苦。幸运的是,有 an RFC 可以使以后的过程更容易。
Also, for now the generated container image is installed locally, is it possible to send it directly in another Docker repo ?
您可以 docker push
它或者您可以将 --publish
标志添加到 pack build
,它会将图像发送到您告诉它使用的任何注册表。
发布标志的工作方式相同,您需要为图像命名 [REGISTRYHOST/][USERNAME/]NAME[:TAG]
。