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服务器包含最新版本,每天晚上将部署一次…
有三种不同的方式来做到这一点, 这里解释
- 在Dockerfile中传递Spring Profile
- 在Docker运行命令中传递Spring Profile
- 在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