【发布时间】: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 重新创建项目解决了这个问题
标签: spring docker intellij-idea spring-boot dockerfile