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

Tec*_*Rik 6 java docker spring-boot dockerfile docker-entrypoint

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

这是我的 dockerfile

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"]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但是都没有效果

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 命令中使用的活动配置文件。如果上述任何内容没有澄清这一点,我们深表歉意。

mic*_*alk 11

解决方案1

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

docker run -p 8000:80 -e SPRING_PROFILES_ACTIVE=dockerdev demo-app
Run Code Online (Sandbox Code Playgroud)

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

解决方案2

将 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"]
Run Code Online (Sandbox Code Playgroud)

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

docker run -p 8000:80 --rm -e SPRING_PROFILE=dockerdev demo-app
Run Code Online (Sandbox Code Playgroud)

  • @TechiRik您应该接受答案或指出是否需要更多帮助。 (2认同)
  • ENTRYPOINT ["java","-Dspring.profiles.active=${SPRING_PROFILE}","-jar","/opt/lib/demo-app.jar"] 对我不起作用,它不会扩展${SPRING_PROFILE} 直到我摆脱了 [] (2认同)

小智 7

JAVA_TOOL_OPTIONS 也许是正确的答案。

docker run -p 8000:80 -e JAVA_TOOL_OPTIONS='-Dspring.profiles.active=dockerdev' demo-app
Run Code Online (Sandbox Code Playgroud)


mch*_*wre 6

使用springboot 中的application.properties来覆盖外部的任何变量。我们在生产环境中大量使用它。

你需要:

  • 将您的更改ENTRYPOINT为:
ENTRYPOINT ["java","-jar","/opt/lib/demo-app.jar","--spring.config.additional-location=/application.properties"]
Run Code Online (Sandbox Code Playgroud)
  • 创建application.properties包含内容的文件:
spring.profiles.active=dockerdev
Run Code Online (Sandbox Code Playgroud)

您还可以使用 覆盖 springboot 代码中使用的任何变量application.properties,也可以覆盖 springboot 特定变量,如此处所述

  • 还将您的docker run命令更改为:
docker run -itd -v /path/to/application.properties:/application.properties image-name
Run Code Online (Sandbox Code Playgroud)

这样,application.properties您的主机中的内容就会安装在您的 docker 容器内。

注意:如果--spring.config.additional-location不起作用,请尝试--spring.config.location选项。

希望这可以帮助。


Sha*_*ran 2

您必须在 docker 文件内提供 JAVA_OPTS,docker 文件的示例如下。

FROM {{ env "DOCKER_REGISTRY" }}/asdf/osX-jre8:{{ env "BASE_IMAGE_VERSION" }}

ADD target/yourapp.jar /app.jar

#Environment vars
ENV NO_PREFIX true
ENV APP_NAME "xxx"
ENV APP_UUID "81b35e09-2a10-48c3-a091-xxxxxxxxx"
ENV HEALTH_CHECK_URL http://localhost:9000/health
ENV SERVICE_PORT 8080

ENV JAVA_OPTS "-Dsun.net.client.defaultConnectTimeout=2000 -Dsun.net.client.defaultReadTimeout=20000 -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/alloc/logs"
Run Code Online (Sandbox Code Playgroud)