我是Spring和Docker的新手。
我使用Gitlab提供的默认模板创建了一个项目。
它带有预定义的Dockerfile,我想在其上添加一些额外的环境变量以在我的application.properties
中使用。
到目前为止,我所做的是在DockerFile内部添加MY_PROP
ENV值,如下所示:
FROM maven:3-jdk-8-alpine
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN mvn package
ENV PORT 5000
ENV MY_PROP testpropertyfromdocker
EXPOSE $PORT
CMD [ "sh", "-c", "mvn -Dserver.port=${PORT} spring-boot:run" ]
像这样设置我的application.properties
:
test.prop=${MY_PROP}
并尝试在基本的RestControntroller
中使用它:
@SpringBootApplication
@RestController
public class DemoApplication {
@Value("${test.prop}")
private String testProp;
@GetMapping("/")
String home() {
return "My prop from docker: " + testProp;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
但是如果我尝试使用
构建我的Docker映像docker build -t demo .
它在
上失败java.lang.IllegalArgumentException: Could not resolve placeholder 'MY_PROP' in value "${MY_PROP}"
我也尝试过直接在IntelliJ中运行项目而不构建Docker映像,但是即使添加.env
文件也遇到相同的错误。
如何将环境变量传递给Spring应用程序?
在IDE中进行调试时是否可以使用.env
文件或类似文件,还是必须构建映像才能运行项目?
PS:我不认为这是Externalising Spring Boot properties when deploying to Docker的重复,或者至少答案应该是更完整的,因为我无法使我的配置按预期工作。
编辑
我更新了pom.xml
,使其包含以下内容:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.2.RELEASE</version>
<configuration>
<environmentVariables>
<MY_PROP>testfromappprops</MY_PROP>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
我做了一个干净的构建并重新同步Maven项目,但是即使通过IDE运行,它仍然失败。
编辑2 我将dmy DockerFile更新为使用java -jar:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENV MY_PROP testpropertyfromdocker
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker build -t demo .
命令行正在运行,但是docker run demo
提供了以下输出:
Error: Invalid or corrupt jarfile /app.jar
此外,当从IDE运行时(“运行”按钮),关于找不到环境变量,我仍然有同样的错误。
谢谢。
答案 0 :(得分:0)
我认为该应用程序的application.properties必须完整,因为日志显示您的应用程序无法读取docker文件。
一旦正确定义了application.properties,就可以运行:
$ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker
有用的指南是here
答案 1 :(得分:0)
我认为这与您运行应用程序的方式有关。
由于您是Spring Boot的新手,所以请消除错误/确认代码的某些部分:
@Value("${test.prop}")
OK test.prop=${MY_PROP}
中使用application.properties
,只要文件放置在src/main/resources
或src/main/resources/config
ENV MY_PROP testpropertyfromdocker
中的Dockerfile
也没问题现在,您的配置中可疑的是您实际运行项目的方式。通常,mvn软件包应创建docker应用程序的JAR(您应该为此使用spring-boot-maven-plugin
)。但是这样做时,应该使用以下命令运行工件:
java -jar <YOUR_ARTIFACT.JAR>
相反,您选择了直接使用maven运行编译的代码库。但是,如果要在maven插件中传播env.variables或系统属性,则应指示插件这样做:
Here是有关环境变量的部分
Here是有关系统属性的部分
通常,与运行就绪工件相比,这种方式更多的是用于调试开发中的应用程序(最好使用上文所述的java -jar
选项)。
因此,我怀疑只要它以这种方式启动应用程序,无论它在何种环境下运行(无论是否在docker中运行,无论在docker中,还是在IDE中)。变量不是“可用”的,因此spring boot根本看不到它们。
更新1
要验证这一点,请确保该环境。变量即使在没有弹簧的情况下也无法真正访问:
转到带有main
批注的类的@SpringBootApplication
方法。
它通常包含运行该应用程序的一行。但即使在此之前,也要尝试打印该env的值。 System.getenv("MY_PROP")