Docker中的Spring Boot

我正在学习如何在Spring Boot应用程序中使用Docker。 我遇到了一个小麻烦,我希望有人能看到这个问题。 我的应用程序严重依赖于在特定于环境的属性文件中设置的@Value。 在我的/ src /主要/资源我有三个属性文件

  • application.properties
  • application-local.properties
  • application-prod.properties

我通常启动我的应用程序:java -jar -Dspring.profiles.active = local build / libs / finance-0.0.1-SNAPSHOT.jar

并读取“application-local.properties”并正常运行。 不过,我正在使用这个src / main / docker / DockerFile:

FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD finance-0.0.1-SNAPSHOT.jar finance.jar RUN sh -c 'touch /finance.jar' EXPOSE 8081 ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /finance.jar" ] 

然后我开始:

docker运行-p 8081:80用户名/ reponame /财务-Dspring.profiles.active =本地

我得到的错误,我的@Values找不到:引起:java.lang.IllegalArgumentException:无法解决值“$ {spring.datasource.driverClassName}”中的占位符“spring.datasource.driverClassName”

但是,这个值在* .local和* .prop属性文件中都存在。

 spring.datasource.driverClassName=org.postgresql.Driver 

我需要做一些特别的事情吗?

更新

根据M. Deinum的反馈,我将我的启动改为:

docker运行-p 8081:80用户名/ reponame /财务-eSPRING_PROFILES_ACTIVE =本地

但是这不起作用,直到我意识到订单的问题,所以现在运行:

docker run -e“SPRING_PROFILES_ACTIVE = test”-p 8081:80 username / reponame / finance

工作得很好。

你可以使用docker run使用Spring Profiles。 使用Springconfiguration文件运行刚刚创build的Docker镜像与将环境variables传递给Docker运行命令一样简单

 $ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker 

您也可以在Docker容器中debugging应用程序。 要debugging应用程序JPDA Transport可以使用。 所以我们把容器当作远程服务器。 要启用此function,请在容器运行期间将JAVA_OPTSvariables和map代理的端口中的java代理设置传递给localhost。

 $ docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" -p 8080:8080 -p 5005:5005 -t springio/gs-spring-boot-docker 

资源链接: 使用Docker进行Spring Boot

每晚使用docker的springconfiguration文件和开发版本:

启动容器时,只需设置环境variablesSPRING_PROFILES_ACTIVE即可。 这将切换Spring应用程序的活动。

以下两行将启动最新的行星开发build立在8081端口和每晚build立在8080端口。

 docker run -d -p 8080:8080 -e \"SPRING_PROFILES_ACTIVE=nightly\" --name nightly-planets-server planets/server:nightly docker run -d -p 8081:8080 -e \"SPRING_PROFILES_ACTIVE=dev\" --name dev-planets-server planets/server:latest 

这可以通过CI系统自动完成。 dev服务器包含最新版本,每天晚上将部署一次…

有三种不同的方式来做到这一点, 这里解释

  1. 在Dockerfile中传递Spring Profile
  2. 在Docker运行命令中传递Spring Profile
  3. 在DockerCompose中传递Spring Profile

下面是一个spring引导项目dockerfile的例子

 <pre>FROM java:8 ADD target/my-api.jar rest-api.jar RUN bash -c 'touch /pegasus.jar' ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=dev","-jar","/rest-api.jar"] </pre> 

您可以使用docker run命令

 docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=dev" --name rest-api dockerImage:latest 

如果你打算使用docker撰写,你可以使用这样的东西

 version: "3" services: rest-api: image: rest-api:0.0.1 ports: - "8080:8080" environment: - "SPRING_PROFILES_ACTIVE=dev" 

更多的描述和例子可以在这里find