1,前言

开发环境总需要调试,docker直接部署不需要调试,环境配置不一样,这里的目的只是,在docker文件环境与开发环境使用不同的配置文件,项目结构如下

2,设置项目配置文件

默认配置文件 application.yml

spring:
profiles:
active: ${spring.profiles.active}

这里有个占位符:${spring.profiles.active} 可以在pom.xml,dockerfile,或 maven(mvn package –P dev)编译时带入,当然也可直接写死 dev 或 prod等

开发配置文件 application-dev.yml

# 开发配置
server:
port:

生成环境配置文件 application-prod.yml

# 生产配置
server:
port:

3,修改pom.xml文件

加入 profiles 环境配置,这里用于测试 在profiles 组中加入 dev,test ,prod 分别代表,开发,测试,生成三个环境的配置

 <profiles>
<profile>
<id>dev</id>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
<!--没有指定其他profile为激活状态时,该profile就默认会被激活-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<spring.profiles.active>test</spring.profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>

build 中加入一个plugin节点内容如下,主要是为了修改spring配置文件占位符(注意是添加不是修改)。

<!-- 这个如果不配置,只能在application.yml中只能通过@...@带入,docker又无法通过@...@带入 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<!-- 使用${..}作为占位符 -->
<delimiter>${*}</delimiter>
</delimiters>
<!-- 同时还支持使用默认的占位符(@..@) -->
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>

build 中加入一个plugin节点内容如下,这个主要用于docker 的编译

<!-- Docker maven plugin -->
<plugin>
<!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->

3,创建一个Dockerfile文件

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD demo-docker-0.0.1-SNAPSHOT.war app.war
RUN sh -c 'touch /app.war'
RUN echo "Asia/Shanghai" > /etc/timezone
#这里prod代表生产环境
ENV spring.profiles.active="prod"
ENTRYPOINT ["java","-jar","/app.war"]

文件内容这里不多做解释

4,测试

(1)直接在idea中启用调试

因为pom.xml的profiles节点中设置了“dev”为默认,所以这里,默认启用调试时,走的是“dev”

(2)设置Run/Debug configurations 的Active profiles = prod 覆盖 pom.xml默认配置dev为“prod”

运行结果如下:

发现这里已经修改为 prod

(3),使用marvn编译命令覆盖默认环境配置,在项目目录执行命令如下:

mvn package -P prod

执行结果如下:

(4),执行docker编译

启动docker结果如下:

五,注意事项

1,application,Dokerfile,pom.xml 节点名称要一致“spring.profiles.active”

spring boot profiles 实现多环境下配置切换 docker版的更多相关文章

  1. spring boot实现不同生产环境下的文件配置

    配置不同生产环境 本文适用于开发环境下需要打包项目至生产环境,避免开发环境的配置文件泄露. 设置maven 作用:1. 手动调节运行时的不同环境 2. 打包时可以不会有其它环境的文件 注:每次换环境前 ...

  2. Spring Boot项目在多环境下(开发、生产或测试环境)调用不同配置文件方式

    写在前面 最近由于项目要求,原先的项目只有开发环境的项目配置,后来不利于线上测试,于是,最近对于SpringBoot这部分多环境配置在网上查找了相关资料,并实现了配置,于是为了防止遗忘,特在此进行总结 ...

  3. Spring Boot 系列(三)属性配置&自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配 ...

  4. 一文掌握 Spring Boot Profiles

    Spring Boot Profiles 简介 Profile 的概念其实很早在 Spring Framework 就有了,在 Spring Framework 3.1 版本引入了注解 @Profil ...

  5. 源码解读 Spring Boot Profiles

    前言 上文<一文掌握 Spring Boot Profiles> 是对 Spring Boot Profiles 的介绍和使用,因此本文将从源码角度探究 Spring Boot Profi ...

  6. 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)

    本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...

  7. 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean

    让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...

  8. Spring Boot 多模块项目创建与配置 (一) (转)

    Spring Boot 多模块项目创建与配置 (一) 最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都 ...

  9. Spring Boot 多模块项目创建与配置 (一)

    最近在负责的是一个比较复杂项目,模块很多,代码中的二级模块就有9个,部分二级模块下面还分了多个模块.代码中的多模块是用maven管理的,每个模块都使用spring boot框架.之前有零零散散学过一些 ...

随机推荐

  1. classLoader和Class.forName的区别

    public class ClassLoaderOrClassForName{ public static void main(String[] args) throws ClassNotFoundE ...

  2. cocoa-charts 导入其依赖库TABlib 报UIKit Foundation找不到的问题

    对于应用到项目中的一些第三方类库,尤其是C/C++ 写的,里面的大部分类文件的后缀都是 .C. 解决办法: 在 build setting 里按照如图所示,进行设置: 这说明以后只要是第三方类库中使用 ...

  3. Linux 文件恢复

    可以恢复,使用系统自还工具debugfs来还原删除的文件 步骤详解 1. 查看一下当前系统版本号,及文件系统格式 [root@localhost ~]# df -T Filesystem Type 1 ...

  4. flashback_scn导出

    1.应用场景2.oracle实现该技术的原理理论,及限制3.实操及与scn时间相关的函数查询 一.flashback_scn导出1) OGG同步,对表的数据进行同步,第一次可以完全导出,中途如果由于某 ...

  5. 02MYSQL查询语句

    查询语句是用于将表里的数据查询出来==查询可以返回一个结果集(表) | 或者的意思   * 代表当前表的所有字段 **查询语句的语法:select *| 字段名列表 from 表名 [where 条件 ...

  6. 6th week blog(1)

    1.CSS单位 px:px就是pixel的缩写,pixel即像素,为绝对单位,页面按精确像素展示 em:相对单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体 ...

  7. C++ 实验3 类和对象

    Part 2 #ifndef GRAPH_H #define GRAPH_H class Graph { public: Graph(char ch, int n); void draw(); pri ...

  8. c/c++的常用函数和STL使用

    一个超好用的c++网站:http://www.cplusplus.com/reference/string/string/erase/ 一.函数头中包含的函数 1.qsort函数对数组.结构体等进行排 ...

  9. Mybatis---架构图

  10. 对只转发结果集的无效操作:provious()

    原因:结果集没有设置为可滚动 解决方法: 将stat = conn.createStatement(); 改为 stmt=conn.createStatement(ResultSet.TYPE_SCR ...