![](/img/trans.png)
[英]How do I use a variable from an application.yml file in my normal code?
[英]How do I get Spring to use an application.yml file in a Docker container?
我正在创建一个简单的 Java/Gradle/Spring 应用程序。 我正在对应用程序进行 Dockerizing。 当我在没有 docker 的情况下在本地运行应用程序时,它会正确使用我的application.yml
文件中的值。 但是,当我运行 Docker 图像时,它不使用application.yml
文件中的任何值。
在我下面的 Dockerfile 中,您会看到我将application.yml
文件复制到与 docker 图像中的 jar 相同的目录中。 此外,在入口点,我适当地引用了application.yml
文件(当我将此文件路径更改为不正确的内容时,应用程序会在启动时中断)。
Dockerfile:
FROM eclipse-temurin:17-jdk
EXPOSE 8080
RUN mkdir -p /app/
ADD build/libs/image-name-0.0.1-SNAPSHOT.jar /app/image-name.jar
ADD build/resources/main/application.yml /app/application.yml
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app/image-name.jar --spring.config.location=file:/app/application.yml"]
下面是我的docker-compose.yml
文件。 我认为这并不重要,因为我仅使用docker run...
命令得到了相同的结果,但我想为上下文添加它:
version: '2'
services:
image-name:
image: 'image-name:latest'
container_name: image-name
ports:
- "8081:8080"
build:
context: .
depends_on:
- postgres_db
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/compose-postgres
- SPRING_DATASOURCE_USERNAME=admin
- SPRING_DATASOURCE_PASSWORD=password
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
postgres_db:
image: 'postgres:13.1-alpine'
container_name: postgres_db
environment:
- POSTGRES_USER=admin # TODO: CHANGE THIS LATER
- POSTGRES_PASSWORD=password # TODO: CHANGE THIS LATER
我添加了 Spring Actuator 依赖项并使用application.yml
公开了健康端点。 但是,当我通过 Docker 图像运行它时,下面的日志丢失了(但当我在没有 Docker 的情况下在本地运行时存在)。 当我点击/actuator/health
端点时,我也会收到 404:
2022-12-26T15:07:08.439-06:00 INFO 23289 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator'
关于我做错了什么的任何想法? 我已经看过似乎所有其他相关的 Stack Overflow 线程,但没有运气。
选项应该放在第一位。
java [options] -jar jarfile [args ...]
在你的情况下应该是:
java -Dspring.config.location=/app/application.yml -jar /app/image-name.jar
好的,我设法解决了这个问题,我真的希望这对将来的人也有帮助,因为几天来我一直在用头撞墙。 我做了 Elyorbek Ibrokhimov 提到的更改,但没有成功。 我什至以最基本的形式重写了所有内容,因此它基本上是文档中的逐字记录,没有运气。
然后我决定简单地更改我的配置以将我的 yaml 文件更改为子环境 yaml 文件,方法是将其重命名为application-local.yaml
,然后将活动配置文件设置为local
并且它起作用了。 我想我将不得不深入了解有关如何处理 application.yaml 文件的文档。 我会用我所做的任何发现来更新它。 也许了解为什么会发生这种情况的人可以添加自己的答案。
下面是我最后的 Dockerfile:
FROM eclipse-temurin:17-jdk
EXPOSE 8080
RUN mkdir -p /app/
ADD build/libs/image-name-0.0.1-SNAPSHOT.jar /app/image-name.jar
ADD build/resources/main/application-local.yml /app/application-local.yml
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -Dspring.config.location=file:/app/application-local.yml -Dspring.profiles.active=local -jar /app/image-name.jar"]
在我完全理解为什么会这样工作之前,我不会将其标记为已接受的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.