繁体   English   中英

如何让 Spring 在 Docker 容器中使用 application.yml 文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM