本文主要介绍如何使用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打包项目并构建镜像
执行maven的package命令:注意:依赖的基础镜像需要先行下载,否则会出现构建镜像超时的情况,比如我本地并没有java8的镜像,就需要先把镜像pull下来,再用maven插件进行构建。
构建成功:
镜像仓库已有该镜像:
运行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