Docker中的Spring Boot

son*_*rin 9 docker spring-boot dockerfile

我正在学习如何使用Springer应用程序使用Docker.我遇到了一个小障碍,我希望有人能看到这个问题.我的应用程序在很大程度上依赖于在特定于环境的属性文件中设置的@Value.在我的/ src/main/resources中,我有三个属性文件

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

然后我开始它:

docker run -p 8081:80用户名/ reponame/finance -Dspring.profiles.active = local

我收到错误,找不到我的@Values:引起:java.lang.IllegalArgumentException:无法解析值"$ {spring.datasource.driverClassName}"中的占位符'spring.datasource.driverClassName'

但是,该值确实存在于*.local和*.prop属性文件中.

spring.datasource.driverClassName=org.postgresql.Driver
Run Code Online (Sandbox Code Playgroud)

我是否需要做一些特别的事情来获取它?

更新:

根据M. Deinum的反馈,我将我的创业改为:

docker run -p 8081:80用户名/ reponame/finance -eSPRING_PROFILES_ACTIVE = local

但这没有用到UNTIL我意识到订单问题,所以现在运行:

docker run -e"SPRING_PROFILES_ACTIVE = test"-p 8081:80用户名/ reponame/finance

工作得很好.

Sky*_*ker 6

您可以使用 docker run Using Spring Profiles。使用 Spring 配置文件运行新创建的 Docker 映像就像将环境变量传递给 Docker 运行命令一样简单

$ docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker
Run Code Online (Sandbox Code Playgroud)

您还可以在 Docker 容器中调试应用程序。可以使用 JPDA Transport 来调试应用程序。因此,我们将容器视为远程服务器。要启用此功能,请在 JAVA_OPTS 变量中传递 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
Run Code Online (Sandbox Code Playgroud)

资源链接: 使用 Docker 的 Spring Boot

将 spring 配置文件与 docker 一起用于夜间和开发构建:

只需在启动容器时设置环境变量 SPRING_PROFILES_ACTIVE。这将切换 Spring 应用程序的活动状态。

以下两行将在端口 8081 上启动最新的 Planets 开发构建,并在端口 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
Run Code Online (Sandbox Code Playgroud)

这可以从 CI 系统自动完成。开发服务器包含最新版本,每晚将每天部署一次...


Abh*_*oda 6

有3层不同的方法可以做到这一点,因为解释这里

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

下面是 Spring Boot 项目 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>
Run Code Online (Sandbox Code Playgroud)

您可以使用 docker run 命令

docker run -d -p 8080:8080 -e "SPRING_PROFILES_ACTIVE=dev" --name rest-api dockerImage:latest
Run Code Online (Sandbox Code Playgroud)

如果你打算使用 docker compose 你可以使用这样的东西

version: "3"
services:
  rest-api:
     image: rest-api:0.0.1
     ports:
       - "8080:8080" 
     environment:
       - "SPRING_PROFILES_ACTIVE=dev"  
Run Code Online (Sandbox Code Playgroud)

可以在此处找到更多描述和示例