在我的 Spring Boot 应用程序中,我想将属性外部化以在 Docker 容器中运行。首次部署时,当前位于 my-server/src/main/resources/application.yml
中的属性会按预期由应用程序加载和使用。一切正常。
但是,我的问题是我需要这些属性可以根据需要进行更新,因此我需要在 Docker 容器上访问一次 application.yml
文件。但此时,在运行 buildDocker
任务之前,它不包含在 build/docker/
目录中,因此在首次部署后不会被复制或访问。
因此,我尝试将 Yaml 文件复制到 docker/
构建目录,将其复制到可访问目录( /opt/meanwhileinhell/myapp/conf
),然后使用 spring.config.location
属性将配置的位置传递给我的 Dockerfile 中的 Jar:
ENTRYPOINT ["java",\
...
"-jar", "/app.jar",\
"--spring.config.location=classpath:${configDirectory}"]
查看在 Docker 容器上运行的命令,我可以看到这是预期的:
/app.jar --spring.config.location=classpath:/opt/meanwhileinhell/myapp/conf]
但是,当我更新此文件中的属性并重新启动 Docker 容器时,它并没有获取更改。文件权限为:
-rw-r--r-- 1 root root 618 Sep 5 13:59 application.yml
该 文档 指出:
配置自定义配置位置时,除了默认位置外,还会使用它们。在默认位置之前搜索自定义位置。
我似乎无法弄清楚我做错了什么或误解了什么,但可能更重要的是,这是为这种 Docker 场景外部化配置的正确方法吗?
原文由 MeanwhileInHell 发布,翻译遵循 CC BY-SA 4.0 许可协议
Docker 映像配置
如果您查看 Spring 建议启动 Spring Boot 驱动的 docker 容器的方式,您会发现:
这意味着您的图像扩展了 openjdk,并且您的容器有自己的环境。如果您这样做,将您想要覆盖的内容声明为 环境属性 就足够了,Spring Boot 将获取它们,因为 环境变量优先 于 yml 文件。
环境变量也可以在您的 docker 命令中传递,以使用您所需的配置启动容器。如果您想为 JVM 内存设置一些限制,请参阅下面的链接。
码头工人组成样本
这里有一个示例,说明了我如何使用 docker compose 启动一个简单的应用程序环境。如您所见,我在此处将
spring.datasource.url
属性声明为环境变量,因此它会覆盖您在application.yml
文件中的所有内容。也可以看看: