Spring Boot 无法读取 Docker 中的 application.properties

Posted

技术标签:

【中文标题】Spring Boot 无法读取 Docker 中的 application.properties【英文标题】:Spring Boot can't read application.properties in Docker 【发布时间】:2017-08-31 08:22:12 【问题描述】:

Spring Boot 在 Docker 容器中运行时不会读取应用程序属性。

我的application.yml

server:
  port: 8080
  context-path: /mail
custom:
  greeting: Hello YML

Dockerfile

FROM java:8-jre
VOLUME /tmp
COPY ./mail.jar /app/mail.jar
RUN sh -c 'touch /app/mail.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app/mail.jar" ]
EXPOSE 8080

还有一个简单的ApplicationController

@RestController
public class ApplicationController 

  private final Environment environment;

  @Autowired
  public ApplicationController(Environment environment) 
    this.environment = environment;
  

  @RequestMapping(path = "/")
  public Hello hello() 
    final Hello hello = new Hello();
    hello.setGreeting(environment.getProperty("custom.greeting"));
    return hello;
  

我正在使用 IntelliJ Docker 插件,它自动映射端口 8080(docker):18080(host) 并使应用程序在 http://localhost:18080

上可用

Docker

    server.context-path 属性未应用。 / 仍可使用应用,而 /mail/ 则不可用 custom.greeting 属性未从属性文件中读取,控制器返回 "greeting":null 而不是 "greeting":"Hello YML"

没有 Docker

    正确应用上下文路径

    custom.greeting 属性由控制器正确返回

【问题讨论】:

您的application.yml 文件在哪里?似乎它不在类路径中,即不包含在您在 docker 映像中提供的 fat jar 中。 Application.yml 在 src/main/resources 路径下,它在类路径上。我还添加了@PropertySource 注释并遇到了同样的问题 添加 spring-boot-starter-actuator 并查看端点 /env 告诉您有关您的环境的信息。你应该看到类似"applicationConfig: [classpath:/application.yml]" : "custom.greeting" : "..." 在没有 docker 的情况下运行时,我可以获得/env 告诉的所有信息。在 Docker 容器中运行时出现错误:出现意外错误(类型=未找到,状态=404)。 @ricardoespsanto Clean 重新创建项目解决了这个问题 【参考方案1】:

对于上下文路径,您必须在属性文件中添加上下文路径。 application-default.properties

server.servlet.contextPath=/myContext

然后构建你的项目,

mvn 全新安装

然后创建一个 docker 镜像并运行该镜像。

【讨论】:

【参考方案2】:

将 Application.yml 重命名为 application.yml。它参考了 cmets 中使用的名称为 Application.yml。

Application.yml 适用于寡妇,但会在 linux 容器内中断。

【讨论】:

【参考方案3】:

您必须在 docker /app/ 目录中添加 application.properties 文件。你的docker目录结构将是

app
   -main.jar
   -application.properties

您可以通过使用ADD /ur/local/location/application.properties /app/application.properties 来做到这一点

那么最好把这个命令写在你的docker文件里

ENTRYPOINT ["java" ,"-Djava.security.egd=file:/dev/./urandom --spring.config.location=classpath:file:/app/application-properties","-jar","/app/main.jar"]

你的整个 dockerFile 应该是这样的:

FROM java:8-jre
VOLUME /tmp
COPY ./mail.jar /app/mail.jar
ADD /ur/local/location/application.properties /app/application.properties
ENTRYPOINT ["java" ,"-Djava.security.egd=file:/dev/./urandom --spring.config.location=classpath:file:/app/application-properties","-jar","/app/main.jar"]
EXPOSE 8080

【讨论】:

以上是关于Spring Boot 无法读取 Docker 中的 application.properties的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot 无法在 docker 中启动

Spring Boot 无法连接 MySQL 并在 Docker/Docker compose 中退出

无法在 Docker 中链接 Consul 和 Spring Boot 应用程序

Spring boot JDBC无法连接到docker容器中的mysql

无法使用 Spring Boot 应用程序连接到 Docker 映像

docker 镜像正在运行,但无法在 Spring Boot 应用程序中访问 REST 端点