自定义 Spring Boot 启动脚本
Posted
技术标签:
【中文标题】自定义 Spring Boot 启动脚本【英文标题】:Customize Spring Boot launch script 【发布时间】:2022-01-24 01:02:32 【问题描述】:我有一个典型的 Spring Boot 2.x
应用程序。我目前正在使用 Docker 部署应用程序。我还在使用“分发”提供的内置 shell 脚本——当通过 Gradle 完成时,阅读:assembleBootDist
、installBootDist
等。
问题是我必须在启动应用程序之前执行 (a) 其他一些 shell 脚本,(b) 以某种方式插入这个 shell 脚本内置的, (c) 或其他达到相同效果的东西。
所以我想知道是否有办法以干净的方式完成此任务,而不会引入任何安全问题等。我一直在尝试插入bootStartScripts
(Gradle)任务,但没有运气。我知道bootJar
中有一个launchScript
属性,但据我所知,它完全取代了Spring Boot 提供的实际内置脚本——我正在避免这种情况。
任何其他 shell-fu 也可以工作,只要安全方面没有受到损害。
【问题讨论】:
【参考方案1】:这是一种 hack,但提供了 spring boot 默认脚本自定义 - 可能您可以使用“inlinedConfScript”(解释为here),它基本上指向一个旨在提供配置的脚本,但因为它是一个脚本文件,技术上你可以像往常一样编写脚本代码。
inlinedConfScript
引用应该在默认值中内联的文件脚本 启动脚本。这可用于设置环境变量,例如 加载任何外部配置文件之前的 JAVA_OPTS。
【讨论】:
感谢您的建议。inlinedConfScript
看起来非常符合我的要求,但我的印象是这只适用于作为 Unix/Linux 服务运行的 Spring Boot 应用程序......但它可能也适用于普通应用程序。将在我这边发布任何更新。【参考方案2】:
Another solution 可以(仍然)使用所需的 shell 脚本并提供初始行为,然后执行 Spring Boot“分发”(Gradle)任务生成的内置 shell 脚本:
#!/usr/bin/env sh
printf "%s\n" "Running some initialization steps..."
# ...
# ...
exec /path/to/application "$@"
将其保存为docker-entrypoint.sh
,并在Dockerfile
的ENTRYPOINT
指令中照常使用。
【讨论】:
以上是关于自定义 Spring Boot 启动脚本的主要内容,如果未能解决你的问题,请参考以下文章