自定义 Spring Boot 启动脚本

Posted

技术标签:

【中文标题】自定义 Spring Boot 启动脚本【英文标题】:Customize Spring Boot launch script 【发布时间】:2022-01-24 01:02:32 【问题描述】:

我有一个典型的 Spring Boot 2.x 应用程序。我目前正在使用 Docker 部署应用程序。我还在使用“分发”提供的内置 shell 脚本——当通过 Gradle 完成时,阅读:assembleBootDistinstallBootDist 等。

问题是我必须在启动应用程序之前执行 (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,并在DockerfileENTRYPOINT 指令中照常使用。

【讨论】:

以上是关于自定义 Spring Boot 启动脚本的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 内嵌启动脚本配置(Customizing the startup script)

Spring Boot中自动执行sql脚本

启动时的 JPA 自定义脚本

spring boot 启动脚本

启动/关闭Spring boot服务脚本

Spring boot centos部署启动停止脚本