DevOps系列文章之 Spring Boot Docker打包

news2025/1/11 19:49:45

应用准备容器化,因为几十个应用从测试到发布太麻烦了,而且还会因为环境的因素导致部署中出现各种问题。为了在开发、测试、生产都能保持一致的环境,就引进了容器技术,而目前常用的应用使用基于spring boot的。

在Spring Boot应用中,我们可以约定不同的标识来定义不同的环境。例如 dev 表示开发环境、test表示测试环境,对应的配置文件为apppcation-dev.yaml、apppcation-test.yaml。我们通过声明spring.profiles.active来激活对应的环境配置,例如激活dev环境时spring.profiles.active=dev。完整的启动命令为:

1

java -Djava.security.egd=file:/dev/./urandom  -Dspring.profiles.active=dev -jar spring-boot-app.jar

根据上面的命令编写一个能够适应多环境的Dockerfile:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# 引入 openjdk 镜像

FROM adoptopenjdk/openjdk8

# 声明作者

LABEL AUTHOR=felord OG=felord.cn

# 挂载几个有用的文件夹 比如日志

VOLUME ["/tmp","/logs"]

# 声明一个环境参数用来动态启用配置文件 默认dev

ENV ACTIVE=dev

# 暴露端口

EXPOSE 8080

# 复制并修改应用打包后的jar文件名称

ADD /target/flyway-spring-boot-1.0.0.jar app.jar

# 容器启动时第一个运行的命令 用来启动应用

ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]

这样打包的Docker镜像就可以通过docker run添加额外的--env ACTIVE=test 来动态的改变环境。单纯的编写Dockerfile不方便我们DevOps。

docker 镜像生命周期

我们需要能够自动地构建、推送到仓库、拉取镜像、运行一系列流水线操作。好在市面上有很多工具来帮助我们实现这一过程。

spring-boot-maven-plugin

这个是Spring Boot官方的插件,在2.x的某个版本(2.3.x)提供了Docker镜像构建能力。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<project>

 <build>

  <plugins>

   <plugin>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-maven-plugin</artifactId>

    <configuration>

     <image>

     <name>docker.repo.com/library/${project.artifactId}:${project.version}</name>

      <publish>true</publish>

     </image>

     <docker>

      <publishRegistry>

       <username>user</username>

       <password>secret</password>

       <url>https://docker.repo.com/v1/</url>

       <email>user@example.com</email>

      </publishRegistry>

     </docker>

    </configuration>

   </plugin>

  </plugins>

 </build>

</project>

配置好Docker私仓后就可以通过mvn clean spring-boot:build-image 进行构建镜像了。

这种方式好处就是无额外依赖,缺点就是需要从github下载构建元件,网络如果不好就容易失败。

Spotify Maven Plugin

Spotify Maven 插件是一个目前比较普遍的选择。它要求应用程序开发人员编写Dockerfile,并把Dockerfile放在项目src/main/docker目录下。然后你就可以通过引入:

1

2

3

4

5

6

7

8

<plugin>

          <groupId>com.spotify</groupId>

          <artifactId>dockerfile-maven-plugin</artifactId>

          <version>1.4.8</version>

          <configuration>

              <repository>repo.com/${project.artifactId}</repository>

          </configuration>

      </plugin>

这个插件提供了mvn dockerfile:build、mvn dockerfile:tag、mvn dockerfile:push三个命令分别用来构建、打标签、发布到远端私有仓库,非常简单。

这个是一个非常容易上手的插件,唯一的要求就是需要会编写Dockerfile,对定制化要求高的可以使用这个。

Jib Maven Plugin

它是谷歌开源的OCI镜像打包工具,可以用来打包Docker镜像,大部分情况下已经满足需要。但是如果你要定制化的话还是不容易的,需要阅读官方给的文档。最开始的Dockerfile如果使用JIb的话需要这样配置:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

<plugin>

    <groupId>com.google.cloud.tools</groupId>

    <artifactId>jib-maven-plugin</artifactId>

    <version>3.0.0</version>

    <configuration>

        <from>

            <image>adoptopenjdk/openjdk8</image>

        </from>

        <to>

            <image>docker.repo.com/library/${project.artifactId}</image>

            <auth>

                <username>felord</username>

                <password>xxxxxx</password>

            </auth>

            <tags>

                <tag>${project.version}</tag>

            </tags>

        </to>

        <extraDirectories>

            <paths>

                <path>

                    <from>target/${project.artifactId}-${project.version}.jar</from>

                    <includes>*.jar</includes>

                    <into>/app.jar</into>

                </path>

            </paths>

        </extraDirectories>

        <containerizingMode>packaged</containerizingMode>

        <container>

            <volumes>/tmp,/logs</volumes>

            <ports>

                <port>8080</port>

            </ports>

            <environment>

                <active>dev</active>

            </environment>

            <entrypoint>

                java,-Djava.security.egd=file:/dev/./urandom,-Dspring.profiles.active=${active},-jar,/app.jar

            </entrypoint>

            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>

        </container>

    </configuration>

</plugin>

优点是不需要本地Docker环境,而且支持分层构建、镜像瘦身,上手容易;缺点是定制化比较困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/679998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI数字人之语音驱动面部模型及超分辨率重建Wav2Lip-HD

1 Wav2Lip-HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型&#xff0c;它们被用于实现数字人的语音和图像方面的功能。通过Wav2Lip-HD项目可以快速使用这两种模型&#xff0c;完成高清数字人形象的打造。 项目代码地址&#xff1a;github地址 1.1…

Canal监听MySQL

Canal监听MySQL 1、Mysql数据库开启binlog模式 注意&#xff1a;Mysql容器&#xff0c;此处Mysql版本为5.7 #进入容器 docker exec -it mysql /bin/bash #进入配置目录 cd /etc/mysql/mysql.conf.d #修改配置文件 vi mysqld.cnf(1) 修改mysqld.cnf配置文件&#xff0c;添加如…

Android:安卓开发使用okHttp进行网络请求和MySQL数据库完成图书馆管理系统APP

1、总体目标 1.1 项目概述 项目名称&#xff1a;基于安卓平台的图书管理系统。 本项目旨在研发一个图书管理系统&#xff0c;实现图书馆的信息化管理。在方便用户在线浏览&#xff0c;借阅&#xff0c;归还图书&#xff0c;方便图书馆管理员对图书进行管理。能很好的为用户提…

从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

1 中断处理程序的基本要求 当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是中断执行完毕后要恢复到原来执行的程序,除了时间流逝外,原来运行的程序应该毫无感知。 具体到Armv…

如何设计一个短信发送功能

本文主要分享了如何设计一个发送短信功能。 一、总结简述 1.梳理多个平台短信API的发送参数&#xff0c;集成封装提供统一的API&#xff0c;支持多个短信平台&#xff08;阿里云、腾讯云、百度云、京东云、七牛云&#xff09;灵活切换 2.提供存储方案&#xff0c;表结构设计…

Redis数据库操作

Redis 命令参考 — Redis 命令参考http://doc.redisfans.com/ 1、Redis&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库 特征&#xff1a; 键值型&#xff0c;支持多种不同数据结构&#xff0c;功能丰富 单线程&#xff0c;每个命令具备原子性 …

C语言督学营(中级阶段)

文章目录 中级阶段9.数据结构概述逻辑结构 与 存储结构时间复杂度、空间复杂度 10.11.12.线性表 (代码实战)线性表的定义、特点1.线性表的顺序存储(顺序表示)&#xff1a;顺序表静态分配动态分配顺序表的定义、初始化、插入、删除、按值查找、按位查找 操作 (代码)&#xff1a;…

go开发多云资产管理平台

go开发多云资产管理平台cmdb 代码仓库github.com/yunixiangfeng/gocmdb 云主机管理 主机资源监控 开发流程 Welcome to Beego | Beego bee new gocmdb/servercd gocmdb/servergo mod tidygo get -u github.com/beego/beego/v2 go get -u "github.com/astaxie/beego/o…

津津乐道设计模式 - 模版模式详解(以女友化妆流程带你彻底明白)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

JDBC-->java如何连接数据库(详细版小白必备)

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大二在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

工业相机——显微镜头/放大镜头

校准尺&#xff0c;最小测量刻度为0.1mm 上图为手机拍的看不清&#xff0c;放了一个网上找的图&#xff0c;校准的详细参数见下图 例如&#xff1a;物距为116mm的显微镜头&#xff0c;这种镜头没有景深&#xff0c;只能测镜头前端到物体116mm的物体 &#xff0c;几乎没有景深&a…

Vscode配置C/C++环境出现报错,导致不能运行代码,报错如下:

Vscode配置C/C环境出现报错&#xff0c;导致不能运行代码&#xff0c;报错如下&#xff1a; 问题描述—gcc : 无法将“gcc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次…

Hexo博客搭建 —— Next主题配置

Hexo博客搭建 —— Next主题配置 文章目录 Hexo博客搭建 —— Next主题配置配置文件区分站点配置文件主题配置文件 配置文件描述简称引入next主题-sitenext主题页面模式设置-next设置首页不显示全文-site设置博客文章持久化连接-site下载插件URL Setting 参考文档 配置文件区分…

【Docker】一文了解DockerFile

文章目录 Dockerfile 概念DockerFile的指令1、FROM 指定基础镜像2、RUN 执行命令3、COPY 复制文件4、ADD 更高级的复制文件5、ENV 设置环境变量6、EXPOSE7、VOLUME 定义匿名卷8、CMD容器启动命令9、ENTRYPOINT入口点10、USER 指定当前用户11、WORKDIR 指定工作目录12、LABEL为镜…

网络安全、Web安全、渗透测试之笔经面经总结含答案

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

4、数据库操作语句:聚合函数

目录 1、定义 2、常用的聚合函数 1&#xff09;Avg/sum&#xff1a;只适用于数值类型的字段&#xff08;或变量&#xff09;。 2&#xff09;Max/min:适用于数值类型、字符串类型、日期时间类型的字段&#xff08;或变量&#xff09; 3&#xff09;Count&#xff1a; ①作…

一起来学孟德尔随机化(Mendelian Randomization)

孟德尔随机化最近实在是太火了&#xff0c;想不关注都不行&#xff0c;最近也花了点时间研究了一下&#xff0c;和大家分享一下&#xff0c;共同学习。 什么是孟德尔随机化&#xff1f; 在19世纪&#xff0c;孟德尔用豌豆花作为实验材料&#xff0c;通过对豌豆花颜色、形状等特…

ESP-BOX的GUI移植

因为squareline studio软件中适配了ESP-BOX&#xff0c;所以作者本想直接使用该软件创建的工程&#xff0c;但是会出现花屏的现象&#xff0c;也不知道是不是没有做好esp-box-lite的适配。 因此只能先用squareline studio设计好GUI&#xff0c;然后再导出其代码&#xff0c;在其…

jmeter-13-使用JSR223断言(推荐)

文章目录 前言一、JSR 223 进行断言二、总结 前言 之前都在使用 BeanShell 前后置、断言等&#xff0c;但是查看官方文档时发现推荐使用 JSR223 其实 BeanShell 是 JSR223 里面的一种&#xff0c;下面我们继续了解下。 官网介绍&#xff1a;Apache JMeter - User’s Manual: C…

【数据分享】1929-2022年全球站点的逐月平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…