在 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 设置为环境变量
使用 Intellij 在 Spring Boot 中使用 Gradle 构建 docker 映像