【发布时间】:2020-04-04 11:21:18
【问题描述】:
我是 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 运行时(“运行”按钮),我仍然有关于未找到环境变量的相同错误。
谢谢。
【问题讨论】: