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

新手上路,请多包涵

在我的 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 许可协议

阅读 665
1 个回答

Docker 映像配置

如果您查看 Spring 建议启动 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 将获取它们,因为 环境变量优先 于 yml 文件。

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


码头工人组成样本

这里有一个示例,说明了我如何使用 docker compose 启动一个简单的应用程序环境。如您所见,我在此处将 spring.datasource.url 属性声明为环境变量,因此它会覆盖您在 application.yml 文件中的所有内容。

 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

也可以看看:

原文由 Aritz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题