作者:天天火火红红 | 来源:互联网 | 2023-01-19 19:46
在我的Spring Boot应用程序中,我想要将属性外部化以在Docker容器中运行.首次部署时,my-server/src/main/resources/application.yml
应用程序按预期加载和使用当前所属的属性.一切正常.
但是,我的问题是我需要这些属性可以根据需要更新,所以我需要application.yml
在Docker容器上访问一次该文件.但此时,它build/docker/
在运行buildDocker
任务之前未包含在目录中,因此在首次部署后不会复制或访问.
所以,我试过的是将Yaml文件复制到docker/
构建目录,将其复制到可访问的目录(/opt/meanwhileinhell/myapp/conf
),并使用该spring.config.location
属性将配置的位置传递给我的Dockerfile中的Jar:
ENTRYPOINT ["java",\
...
"-jar", "/app.jar",\
"--spring.config.location=classpath:${configDirectory}"]
看看在Docker容器上运行的Command我可以看到这是预期的:
/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场景的配置外部化的正确方法吗?
1> Xtreme Biker..:
DOCKER IMAGE CONFIGURATION
如果你看一下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 SAMPLE
这里有一个示例,说明如何使用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
也可以看看:
如何将环境变量传递给Docker容器?
限制Docker容器中的JVM内存消耗
这个答案有点过时了。“使用Docker引导”指南现在使用Java作为入口点,而不是sh:`ENTRYPOINT [“ java”,“......。此外,现在可以将JDK_JAVA_OPTIONS(JDK-8170832)环境变量用于VM选项。
2> PaulNUK..:
就个人而言,我会使用Spring Cloud Config Server而不是尝试在整个地方设置属性文件.
tl; dr它允许您在集中位置的每个环境/配置文件级别保存git中的属性(允许版本控制,分支等),然后由REST提供.Spring Boot完全支持它; 实际上它只是另一个属性源,最终在您的环境中.
https://spring.io/guides/gs/centralized-configuration/