使用maven插件将springboot应用打包生成docker镜像并上传到Harbor远程仓库
文章目录
本文将介绍通过maven插件,一键实现将springboot应用构建成docker镜像并上传到远程仓库的过程。
一、Maven 生命周期
idea 配置maven后,我们在右边栏能看到 Lifecycle这一栏, 里面包含了maven 所有的生命周期阶段所干的事。
生命周期阶段 | 描述 |
---|---|
验证 validate | 验证项目 |
编译 compile | 编译项目的源代码 |
测试 Test | 使用Junit运行测试 |
包装 package | 打jar包或者war包 |
检查 verify | 对集成测试的结果进行检查 |
安装 install | 将项目安装到本地仓库 |
部署 deploy | 部署项目到远程仓库 |
二、打包插件 dockerfile-maven-plugin
该插件由 spotify官方维护,可以通过编写dockerfile来将springboot应用构建成docker镜像,dockerfile 可以放在根目录下即可。
1. 编写Dockerfile
FROM java:8
WORKDIR app
ADD ./target/my-shop-project.jar /app/my-app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","/app/my-app.jar"]
MAINTAINER zhengbing
ENTRYPOINT 类似于CMD治理,在终端执行。
EXPOSE 指定运行端口为 8080.
WORKDIR 指定工作目录。
ADD 将项目添加到工作目录里。
2. 配置server
我们可以通过在maven里配置远程仓库的ip 、用户名和密码实现访问远程镜像仓库。 在settings.xml文件中的 标签下添加需要访问远程仓库服务器的ip, 用户名和密码, 推荐使用此方式来认证,因为我们不会把关键信息放在远程git的配置里。
<servers>
<server>
<id>116.62.146.90</id>
<username>***</username>
<password>*****</password>
</server>
</servers>
3. 配置plugin
在使用该plugin插件前,需要注意一点,因为我已经躺坑一小时~
注: 不要使用<PluginManageMent> 标签包住 plugins ,否则会出现打包后的jar 运行不起来,报没有主程序之类、no main manifest attribute之类的问题。
在使用插件dockerfile-maven-plugin插件时,让我们先了解一下executions和goal标签的用法。
1) executions、phase和goal 标签介绍
- <executions >标签在插件加载的时候可以通过该标签执行一下指令,配合子标签来使用,我们可以在放入一些需要执行的动作和指令。
- <phase>标签用来捕获执行的maven声明周期里的某个阶段, maven 有以下三个标准的生命周期。
clean:项目清理的处理
default(或 build):项目部署的处理
site:项目站点文档创建的处理
我们可以在default周期里的里的某个阶段赋值给 <phase>标签 - <goal >用goal标签执行生命周期里的某个动作, 例如在打包阶段执行打包和推送远程仓库的动作。
<execution>
<id>build_image</id>
<phase>package</phase>
<goals>
<!--如果package时不想用docker打包,就注释掉这个goal -->
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
2)dockerfile-maven-plugin和pom.xml完整配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.shop</groupId>
<artifactId>my-shop</artifactId>
<version>0.0.7-SNAPSHOT</version>
<name>my-shop</name>
<description>project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<docker.registry.url>116.62.146.90</docker.registry.url>
<docker.namespace>my-shop</docker.namespace>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--MyBatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
<!--集成druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- MyBatis 生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.3</version>
</dependency>
<!--Mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>my-shop-project</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>build_image</id>
<phase>package</phase>
<goals>
<!--如果package时不想用docker打包,就注释掉这个goal -->
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<contextDirectory>${project.basedir}</contextDirectory>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
以上步骤只是我们整个过程的准备阶段和开胃菜,重点来了!!!
三、在windows环境下安装docker环境
1) 安装docker
docker for windows 官方下载地址: https://www.docker.com/products/docker-desktop
直接点击安装后, 不出意外就出现了报错问题! 一直报错:
WSL 2 installation is incomplete.
经过千辛万苦,终于找到了解决方法, 点击以下连接,更新wsl 镜像即可。
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
感谢下面的大佬帮忙解决安装不上的问题!
参考博客: https://xunmi.blog.csdn.net/article/details/108625840
接着点击package打包, 自动构建镜像并推送。
到最后推送一步时出现错误: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)!
果然不出所料, 还是报错了!!! 因为在linux环境下,如果不配置–insecure registry也会出现同样的问题。因为docker的默认交互方式是Https的,因此需要配置 --insecure 模式的交互。
如果启动时,出现报错:Failed to set version to docker-desktop: exit code: -1
以管理员的身份打开cmd命令窗口,输入命令:
netsh winsock reset
成功后,再次重启docker即可。
感谢大佬文章: https://blog.csdn.net/MShow006/article/details/103774672
2) 远程仓库开放支持Http上传镜像的方式
在docker.service文件中添加支持TCP的配置,将原先的配置更改如下:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
如果不知道docker.sersvice所在的路径,可以参考我的另外一篇博客:
https://blog.csdn.net/qq_33036061/article/details/115293724
tcp端口配置好后,可以通过systemctl status docker.service
命令查看运行状况。
3) 本地配置远程仓库地址
参考linux的 解决方式, 找到docker的配置文件daemon.json文件,所在位置为用户下 ~/.docker/daemon.json。
编辑 daemon.json,添加远程仓库ip, 将ip 地址添加到 insecure-registries字段里, 同时也可以配置一下镜像,提升本地获取镜像和上传镜像的速度。将远程仓库的ip 放入到 insecure-registries, 因为我搭建的Harbor的默认使用的80端口,可以直接填写ip即可。
{
"registry-mirrors": ["https://aiio42ii.mirror.aliyuncs.com"],
"insecure-registries": ["116.62.146.90"],
"debug": false,
"experimental": false,
"features": {
"buildkit": true
}
}
修改完毕后,记得重启docker, 在桌面图标上邮件即可。
重启docker成功后,重复打包步骤!
推送成功!
更多推荐
所有评论(0)