300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【Spring boot 实战】使用Maven插件构建Docker镜像

【Spring boot 实战】使用Maven插件构建Docker镜像

时间:2022-12-06 19:54:15

相关推荐

【Spring boot 实战】使用Maven插件构建Docker镜像

本文主要介绍如何使用Maven插件将SpringBoot应用打包为Docker镜像,并上传到私有镜像仓库Docker Registry的过程。

使用Maven构建本地Docker镜像

我们以项目spring-admin为例

在应用的pom.xml文件中添加dockerfile-maven-plugin的依赖

<plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${dockerfile-maven-version}</version><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions><configuration><repository>andanyoung/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs><useMavenSettingsForAuth>true</useMavenSettingsForAuth></configuration></plugin>

相关配置说明:

executions.execution.phase:此处配置了在maven打包应用时构建(build)docker镜像并执行Push;repository:The repository to name the built image,project.artifactId为镜像名称,{project.artifactId}为镜像名称,project.artifactId为镜像名称,{project.version}为镜像版本号;tag:${project.version}为镜像版本号。默认latest;buildArgs:编译参数

在项目根目录新建Dockerfile 文件

FROM openjdk:8-jdk-alpineMAINTAINER 1218853253@ARG JAR_FILEENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneEXPOSE 9020ADD ${JAR_FILE} app.jarENTRYPOINT /usr/bin/java -Djava.security.egd=file:/dev/./urandom -jar app.jar

使用IDEA打包项目并构建镜像

注意:依赖的基础镜像需要先行下载,否则会出现构建镜像超时的情况,比如我本地并没有java8的镜像,就需要先把镜像pull下来,再用maven插件进行构建。

执行maven的package命令:

构建成功:

镜像仓库已有该镜像:

运行Spring-admin项目

使用docker命令启动 :

docker run -p 9020:9020 --name spring-admin -d andanyoung/spring-admin:0.0.3

进行访问测试,地址:http://localhost:9020/

使用dockerfile-maven-plugin推送到 docker.io

修改dockerfile-maven-plugin 配置

方式一:

将docker仓库的账号密码写入pom.xml 中。缺点pom.xml在版本控制之内,容易泄露docker仓库账号密码。所以不推荐。

<configuration><repository>andanyoung/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs><username>andanyoung</username><password>******</password></configuration>

方式二(推荐):

将账号密码配置在maven的settings.xml文件中。需要设置useMavenSettingsForAuth为true

<configuration><repository>andanyoung/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs><useMavenSettingsForAuth>true</useMavenSettingsForAuth></configuration>

`.m2/settings.xml`

<settings><servers><server><id>docker.io</id><username>andanyoung</username><password>******</password></server></servers></settings>

推送到官方仓库 docker.io

mvn dockerfile:push

推送结果

push 推送 官方docker.io 结果

推送到私仓 - Docker Registry

Docker Registry

Harbor 2.x搭建 参考《搭建Harbor 2.x仓库 - docker私仓搭建》这里不再累赘。

修改配置

pom.xml

<configuration><repository>${docker.host}/andanyoung/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs><useMavenSettingsForAuth>true</useMavenSettingsForAuth></configuration>

repository 添加docker.host

.m2/settings.xml

<server><id>${docker.host:ip}</id><username>andanyoung</username><password>******</password></server>

docker.host替换为自己的私仓地址,如果{docker.host} 替换为自己的私仓地址,如果docker.host替换为自己的私仓地址,如果{docker.host}是http的,添加则信任

"insecure-registries": ["${docker.host:ip}"]

项目源码地址

/andanyoung/spring-admin

QA

1. Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect

2. mvn dockerfile:build mvn dockerfile:push 太慢

查看 build time takes too long after update version 1.4.10 to 1.4.13

dockerfile-maven 1.4.13 版本的问题将他切回 1.4.10即可

使用docker-maven构建远程Docker镜像

在应用的pom.xml文件中添加docker-maven-plugin的依赖

<plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><imageName>andanyoung/${project.artifactId}</imageName><baseImage>openjdk:8-jdk-alpine</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><!-- copy the service's jar file from target into the root directory of the image --><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>

相关配置说明:

executions.execution.phase:此处配置了在maven打包应用时构建(build)docker镜像并执行Push;imageName:用于指定镜像名称,andanyoung/project.artifactId是仓库名称,{project.artifactId}是仓库名称,project.artifactId是仓库名称,{project.artifactId}为镜像名称,${project.version}为镜像版本号;dockerHost:打包后上传到的docker服务器地址;baseImage:该应用所依赖的基础镜像,此处为java;entryPoint:docker容器启动时执行的命令;resources.resource.targetPath:将打包后的资源文件复制到该目录;resources.resource.directory:需要复制的文件所在目录,maven打包的应用jar包保存在target目录下面;resources.resource.include:需要复制的文件,打包好的应用jar包。

不推荐该做法,应该Docker配置在pom.xml 上不灵活

问题

unauthorized: unauthorized to access repository: ces/ces-auth, action: push: unauthorized to access repository: ces/ces-auth, action: push

所有操作多对的,那可能是端口模式默认的 80/443

解决方案

加端口(8080)

docker login -u admin -p Harbor12345 172.16.46.111:8080docker push 172.16.46.111:8080/mynginx/nginx:v1.0

.m2/settings.xml

172.16.46.111:8080 andanyoung ******

参考:

/p/90122357

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。