在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果

Posted

技术标签:

【中文标题】在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果【英文标题】:Setting active spring profile using gradle in docker does not have any effect 【发布时间】:2020-03-24 00:14:38 【问题描述】:

我有一个包含以下文件的 spring boot 项目:

application.yml(默认) application-dev.yml(显然是我的开发配置) Dockerfile-dev docker-compose-dev.yml

我的Dockerfile-dev 包含以下设置:

FROM gradle:5.2.1-jre11 AS BUILDSTAGE

USER root
WORKDIR /output

COPY . .

RUN gradle application:build -Dspring.profiles.active=dev --no-daemon
RUN find /output/application/build/libs

FROM openjdk:11-jre

WORKDIR /app

COPY application/wait-for-it.sh ./wait-for-it.sh
COPY --from=BUILDSTAGE /output/application/build/libs/application-*.jar ./application.jar

RUN chmod +x wait-for-it.sh

ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "application.jar"]

请不要被 wait-for-it.sh 弄糊涂了,这是一个简单的 shell 脚本,它确保 spring boot 在数据库启动后启动。

如您所见,我使用-Dspring.profiles.active=dev 构建,因此据我了解,这是将活动弹簧配置文件设置为dev,这应确保使用application-dev.yml 配置而不是application.yml

我的build.gradle 包含:

bootRun 
    systemProperties = System.properties

我的docker-compose 文件正在使用Dockerfile-dev

version: "3"

services:

  db:
    image: mysql:8.0.18
    environment:
      MYSQL_DATABASE: "test"
      MYSQL_USER: "test"
      MYSQL_PASSWORD: "test"
      MYSQL_ROOT_PASSWORD: "mysql"
      MYSQL_ROOT_HOST: "%"
    ports:
      - "3306:3306"

  app:
    depends_on:
      - db
    build:
      context: ..
      dockerfile: application/Dockerfile-dev
    ports:
      - "8080:8080"
      - "5005:5005"

当我执行docker-compose -f application/docker-compose-dev.yml up --force-recreate --build -V --remove-orphans 时,我得到以下输出:

Building app
Step 1/12 : FROM gradle:5.2.1-jre11 AS BUILDSTAGE
 ---> d57eadc2e4d3
Step 2/12 : USER root
 ---> Using cache
 ---> 72aa645c307e
Step 3/12 : WORKDIR /output
 ---> Using cache
 ---> 327fd32c6c3d
Step 4/12 : COPY . .
 ---> 055d0c0c09e9
Step 5/12 : RUN gradle application:build -Dspring.profiles.active=dev --no-daemon
 ---> Running in c2a23d7fc2b3

所以这似乎很好。但是稍后在spring应用程序启动时的日志中:

app_1  |
app_1  |   .   ____          _            __ _ _
app_1  |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app_1  | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app_1  |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app_1  |   '  |____| .__|_| |_|_| |_\__, | / / / /
app_1  |  =========|_|==============|___/=/_/_/_/
app_1  |  :: Spring Boot ::        (v2.1.4.RELEASE)
app_1  |
app_1  | 2019-11-27 09:47:15,388 INFO  [main] [d.f.backend.ApplicationKt] - Starting ApplicationKt on 5f5fc7f3dddf with PID 1 (/app/application.jar started by root in /app)
app_1  | 2019-11-27 09:47:15,403 INFO  [main] [d.f.backend.ApplicationKt] - No active profile set, falling back to default profiles: default

如您所见No active profile set,因此它将使用默认值,即application.yml。 所以似乎我对如何在我的设置中设置活动弹簧配置文件有误解/错误配置。如何设置?

【问题讨论】:

【参考方案1】:

您在构建应用程序时设置配置文件,而不是在运行应用程序时设置配置文件(通过入口点):

ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-Dspring.profiles.active=dev", "-jar", "application.jar"

【讨论】:

以上是关于在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果的主要内容,如果未能解决你的问题,请参考以下文章

使用 gradle-docker-plugin 将 docker 服务器 IP 设置为环境变量

gradle 连续构建技巧在 docker 容器中不起作用

使用 Intellij 在 Spring Boot 中使用 Gradle 构建 docker 映像

Docker 中缓慢的 gradle 构建。缓存 gradle 构建

Gradle Docker 下载依赖项

Gradle项目构建docker镜像(支持Gradle多模块)