如何通过docker run命令

时间:2019-06-29 01:03:08

标签: java spring-boot docker 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"]

我尝试了以下方法,但是没有用

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命令中使用的活动配置文件。抱歉,以上没有说明。

6 个答案:

答案 0 :(得分:1)

您可以尝试更改您的

ENTRYPOINT ["java","-Dspring.profiles.active=dockerdev","-jar","/opt/lib/demo-app.jar"]

ENTRYPOINT ["java","$JAVA_OPTS","-jar","/opt/lib/demo-app.jar"]

,以便您在容器内的应用会考虑您在容器运行期间通过的JAVA_OPTS

chrylis建议,另一种选择是传递SPRING_PROFILES_ACTIVE这样的环境变量:

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

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

答案 1 :(得分:1)

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

您需要:

  • 将您的ENTRYPOINT更改为:
ENTRYPOINT ["java","-jar","/opt/lib/demo-app.jar","--spring.config.additional-location=/application.properties"]
  • 使用内容创建application.properties文件:
spring.profiles.active=dockerdev

您还可以使用application.properties覆盖springboot代码中使用的所有变量,也可以覆盖here所述的springboot特定变量。

  • 还将docker run命令更改为:
docker run -itd -v /path/to/application.properties:/application.properties image-name

这样您主机上的application.properties将被挂载    在您的Docker容器中。

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

希望这会有所帮助。

答案 2 :(得分:0)

您必须在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"

答案 3 :(得分:0)

您应该将环境变量JAVA_OPTS添加到您的Dockerfile中

FROM tomcat:8.5.47-jdk8-openjdk

LABEL build_date="2020-07-14" \
      name="Ousama EL IDRISSI" \
      version="1.0" \
      description="Docker Image made by la7ya"

EXPOSE 8080

COPY ./target/la7yaman-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war

ENV JAVA_OPTS="-Dspring.profiles.active=docker-demo"

CMD ["catalina.sh", "run"]

答案 4 :(得分:0)

正在为非Spring(普通Java应用程序)寻找答案的人们

这是发送系统属性/参数的方法:将Dockerfile更改为

docker build -t demo-app .

构建图像:

docker run -e "JAVA_TOOL_OPTIONS=-Xms1024m -Xmx2048m -Dspring.profiles.active=dockerdev" -p 8080:8080 demo-app

然后使用以下命令运行docker容器:

matrix(readr::parse_number(a), dim(b))
#     [,1] [,2] [,3]
#[1,]    7   65    1
#[2,]   11    7   77
#[3,]   22    8   34

答案 5 :(得分:0)

JAVA_TOOL_OPTIONS 也许是正确的答案。

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