如何在 docker run 命令中将 Java 选项/变量传递给 Springboot 应用程序

新手上路,请多包涵

我有一个 Spring Boot 应用程序,它使用配置文件在不同的环境中进行配置。我想将此配置文件信息作为参数传递给我的 docker run 命令。我该怎么做?

这是我的码头文件

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/demo-app-1.0-SNAPSHOT.jar

COPY ${JAR_FILE} /opt/lib/demo-app.jar

EXPOSE 80

# ENTRYPOINT ["java","-Dspring.profiles.active=dockerdev","-jar","/opt/lib/demo-app.jar"]
# Above line works, but not desired as profile will change in diff envs
ENTRYPOINT ["java","-jar","/opt/lib/demo-app.jar"]

我尝试了以下方法,但都不起作用

docker run -p 8000:80 demo-app -Dspring.profiles.active=dockerdev

docker run -p 8000:80 demo-app --rm -e JAVA_OPTS='-Dspring.profiles.active=dockerdev'

请帮忙。

澄清: 我正在使用多个配置文件。因此,我不希望在应用程序或 docker 文件中提及活动配置文件。相反,我想使用相同的应用程序和 docker 文件并在不同的环境中运行它,并传递要在 docker run 命令中使用的活动配置文件。抱歉,如果以上内容没有阐明这一点。

原文由 TechiRik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
1 个回答

解决方案 1

您可以通过使用 -e 选项将其传递给 docker 容器来覆盖配置中的任何属性。如 Externalized configuration 中所述,环境变量名称应大写并使用下划线分隔。因此,例如要传递 spring.profiles.active 属性,您可以在容器运行期间使用 SPRING_PROFILES_ACTIVE 环境变量:

 docker run -p 8000:80 -e SPRING_PROFILES_ACTIVE=dockerdev demo-app

这个变量应该由 Spring 从环境中自动选择。

方案二

将 Dockerfile 更改为:

 FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/demo-app-1.0-SNAPSHOT.jar

# environment variable with default value
ENV SPRING_PROFILE=dev

COPY ${JAR_FILE} /opt/lib/demo-app.jar

EXPOSE 80

#run with environment variable
ENTRYPOINT java -Dspring.profiles.active=$SPRING_PROFILE jar /opt/lib/demo-app.jar

然后运行传递环境变量的容器:

 docker run -p 8000:80 --rm -e SPRING_PROFILE=dockerdev demo-app

原文由 Michał Krzywański 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题