部署到 Docker 时外部化 Spring Boot 属性

2024-04-18

在我的 Spring Boot 应用程序中,我想将属性外部化以在 Docker 容器中运行。首次部署时,当前的属性my-server/src/main/resources/application.yml由应用程序按预期加载和使用。一切正常。

但是,我的问题是我需要根据需要更新这些属性,因此我需要访问application.yml在 Docker 容器上创建一次文件。但目前,它还没有包含在build/docker/运行之前的目录buildDocker任务,因此在首次部署后不会被复制或访问。

所以,我尝试的是将 Yaml 文件复制到docker/build 目录,将其复制到可访问的目录(/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

The 文档 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html状态:

配置自定义配置位置时,还会额外使用它们 到默认位置。在之前搜索自定义位置 默认位置。

我似乎无法弄清楚我做错了什么或误解了什么,但可能更重要的是,这是针对这种类型的 Docker 场景外部化配置的正确方法吗?


Docker 镜像配置

如果你想Spring 推荐的方式 https://spring.io/guides/gs/spring-boot-docker/要启动 Spring Boot 支持的 docker 容器,您会发现:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

这意味着您的映像扩展了 openjdk,并且您的容器拥有自己的环境。如果你这样做,那么将你想要覆盖的内容声明为就足够了环境属性Spring Boot 会获取它们,因为环境变量优先 https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html覆盖 yml 文件。

环境变量也可以在 docker 命令中传递,以使用所需的配置启动容器。如果您想为 JVM 内存设置一些限制,请参阅下面的链接。


Docker 编写示例

这里有一个示例,展示了我如何使用 docker compose 启动一个简单的应用程序环境。如你所见,我宣布spring.datasource.url属性在这里作为环境变量,因此它会覆盖您在application.yml file.

version: '2'
services:
    myapp:
        image: mycompany/myapp:1.0.0
        container_name: myapp
        depends_on:
        - mysql
        environment:
            - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/myapp?useUnicode=true&characterEncoding=utf8&useSSL=false
        ports:
            - 8080:8080

    mysql:
        image: mysql:5.7.19
        container_name: mysql
        volumes:
            - /home/docker/volumes/myapp/mysql/:/var/lib/mysql/
        environment:
            - MYSQL_USER=root
            - MYSQL_ALLOW_EMPTY_PASSWORD=yes
            - MYSQL_DATABASE=myapp
        command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8

也可以看看:

  • 如何将环境变量传递给 Docker 容器? https://stackoverflow.com/questions/30494050/how-do-i-pass-environment-variables-to-docker-containers
  • 限制 Docker 容器中的 JVM 内存消耗 https://stackoverflow.com/questions/37490324/limit-jvm-memory-consumption-in-a-docker-container
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

部署到 Docker 时外部化 Spring Boot 属性 的相关文章

随机推荐

  • 在 MATLAB 中调整 3D 矩阵(图像)的大小

    我有一个 3D 矩阵 MxNxK 想将其大小调整为 M xN xK 就像 matlab 中的 imresize 一样 我正在使用图像金字塔 但其结果不是很准确 需要一个更好的 有什么解决办法吗 你可以使用interp3 因为您想要插入 3D
  • 从 Dataflow 写入 BigQuery - 作业完成时不会删除 JSON 文件

    我们的 Dataflow 作业之一将其输出写入 BigQuery 我对其幕后实现方式的理解是 Dataflow 实际上将 JSON 格式的结果 分片 写入 GCS 然后启动 BigQuery 加载作业以导入该数据 但是 我们注意到 无论作业
  • CSS 中的鼠标按下选择器是什么?

    我注意到按钮和其他元素具有默认样式 并按 3 个步骤运行 普通视图 悬停 焦点视图和鼠标按下 单击视图 在 CSS 中我可以更改普通视图和悬停视图的样式 如下所示 button background 333 color FFF button
  • ngResource 将 POST 参数附加到 url

    我有一个看起来像这样的角度服务 我在这里发出 POST 请求 factory Apples function resource HOST return resource HOST apples create method POST para
  • 使用 XPath 排序 - 不是 XSL

    XPath DOM 编程中有什么方法可以使用System Xml to run selectNodes XPATH 带有排序参数 例如 对于以下 XML 程序按照与文档相同的顺序 降序 写入值 有没有办法使用 XPath 来按升序获取值 笔
  • 是否可以使用计时器为 JButton 创建淡入效果?

    我想在我的程序按钮上添加一些效果 当我按下button the button应该淡入 Using a timer改变的值Opaque in new Color 是一种方式 但是可以应用于JButton还有 因为JButton有边界 所以我想
  • 分配后列表被意外清除[重复]

    这个问题在这里已经有答案了 class ListHolder public List
  • 应用程序中所有国家/地区的城市和邮政编码

    有没有一种方法可以将所有国家 州 城市的邮政编码存储在一个数据库中 我一直在到处寻找 我发现地名网 http www geonames org 我猜其中包含了所有内容 但无法直接获取该数据 我正在使用导轨 如果有任何助手或插件就太好了 如果
  • 更改 iOS 中的应用程序语言设置而不是整个设备

    我希望在我的应用程序中可以选择更改我的应用程序语言 只是应用程序语言而不是整个系统 请给我一些提示好吗 提前致谢 我知道本地化 您可以使用从 Xcode 设置的自定义构建标志来完成此操作 这样您就可以在本地化下运行应用程序 而无需更改设备的
  • 当我单击数据表中的下一页时,我的 jquery 选择器不再工作

    我在用着数据表 http www datatables net jquery 插件在页面上显示我的数据 当有人单击一行时 我有这个选择器 myTable tr class tableHeader click function alert c
  • 多线程程序中的 std::string

    鉴于 1 C 03标准没有以任何方式解决线程的存在 2 C 03 标准将其留给实现来决定是否std string应该在其复制构造函数中使用 Copy on Write 语义 3 写时复制语义通常会导致多线程程序中不可预测的行为 我得出以下看
  • 为什么要使用Promise.resolve().then()?

    在阅读 Angular 指令的代码时路由器链路激活 https github com angular angular blob master packages router src directives router link active
  • 释放 GCD 调度队列属性的正确方法是什么?

    我正在使用一个dispatch queue 它是通过其所有者的属性访问的 如下所示 property nonatomic assign dispatch queue t queue 请注意assign关键词 队列在对象的整个生命周期中使用
  • 嵌套属性未以简单形式显示

    鉴于以下情况 Models class Location lt ActiveRecord Base has many games end class Game lt ActiveRecord Base validates presence
  • 如何获取 BTreeSet 中元素的下界和上限?

    正在阅读BTreeSet文档 我似乎无法弄清楚如何从 a 中获取大于元素的最小值或小于元素的最大值BTreeSet在对数时间内 我看到有一个range https doc rust lang org std collections stru
  • 将 Elmah 与 WebApi 结合使用时,错误会记录两次

    我正在尝试使用 elmah 记录我的 asp net web api 项目中的异常 我遇到的问题是每个错误都会记录两次 我正在使用 Elmah Contrib Web Api 我的应用程序类如下 public class WebApiApp
  • 用 R 计算年龄

    我在 R 中有两个数据帧 其中一个数据帧包含一个人的出生年份 YEAR 1931 1924 然后另一列显示最近的时间 RECENT 09 08 2005 11 08 2005 我想做的是减去年份 以便我可以计算他们的年龄 但我不知道如何处理
  • Rails respond_with:它是如何工作的?

    我到处读到关于它有多酷的内容respond with方法在 Rails 3 中 但我什至无法在 Rails API 中或通过搜索源代码找到对它的引用 任何人都可以向我解释它是如何工作的 您可以使用哪些选项等 或者向我指出它实际实现的位置 以
  • 在事务结束时发送事件

    我有一个服务对象的接口 如下所示 为简洁起见进行了简化 public interface ItemService public Item getItemById String itemId int version public void c
  • 部署到 Docker 时外部化 Spring Boot 属性

    在我的 Spring Boot 应用程序中 我想将属性外部化以在 Docker 容器中运行 首次部署时 当前的属性my server src main resources application yml由应用程序按预期加载和使用 一切正常