环境变量配置远程docker地址
tcp://localhost:2375
如果是windows本地打包成docker镜像,则还需要下载docker desktop
《Windows安装Docker Desktop并配置镜像、修改内存占用大小》
docker desktop开启docker远程连接
配置镜像追加harbor域名解析
{
"builder": {
"gc": {
"defaultKeepStorage": "40GB",
"enabled": true
}
},
"debug": false,
"experimental": false,
"features": {
"buildkit": true
},
"insecure-registries": [
"harbor域名:port"
],
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
打包到本地docker desktop然后idea 使用 maevn 插件 com.spotify:dockerfile-maven-plugin 执行 mvn dockerfile:push 命令时报 unauthorized to access repository
找到用户目录下的config.json文件
把auths的值改成{},如下所示:
{
"auths": {},
"credsStore": "desktop",
"currentContext": "default",
"plugins": {
"-x-cli-hints": {
"enabled": "true"
}
}
}
然后再在idea 里面执行mvn dockerfile:push命令
注意事项
如果执行以下命令失败,先把mvn的-q参数去掉,让错误输出到控制台。
《idea配置优化、Maven配置镜像、并行构建加速打包、解决maven打包时偶尔几个文件没权限的问题》下面的使用company-repo私有仓库和阿里云镜像仓库同时使用的配置参考。
pom.xml
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<!-- 远程 Docker 仓库地址 -->
<repository>${harbor.url}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<APP_NAME>${project.build.finalName}</APP_NAME>
</buildArgs>
<noCache>true</noCache>
<username>admin</username>
<password>123456</password>
</configuration>
</plugin>
Dockerfile
FROM openjdk:1.8.362
MAINTAINER bsoft
# 将jar包添加到容器中并更名为app.jar
ARG APP_NAME
ADD ./target/$APP_NAME.jar /app.jar
# JAVA参数,如-Xmx4g
ENV JAVA_OPTS="-Xms256m -Xmx256m"
# OPS参数,如
ENV OPS_OPTS=""
# Spring Boot参数
ENV BOOT_OPTS=""
# 运行jar包
ENTRYPOINT ["/bin/sh",\
"-c",\
"java \
${JAVA_OPTS} \
${OPS_OPTS} \
-jar /app.jar \
${BOOT_OPTS}"]
bat
1C含义:使用线程数=1 * CPU个数,以8核,16线程为例,即:1 乘 8 = 8
@echo off
set THREAD=1C
echo set JAVA_HOME
set JAVA_HOME=%JAVA_HOME%
echo 如果JAVA_HOME和mvn不一致,则手动修改jdk版本,即:set JAVA_HOME=C:/Users/X/.jdks/corretto-1.8.0_392
echo package......
start /B /WAIT cmd /c "mvn clean package -T %THREAD% -D maven.test.skip=true -P company-repo,dev -q -f pom.xml"
rem 如果cmd执行失败,则后续的命令不会执行。
if %ERRORLEVEL% neq 0 (
echo Error: mvn clean compile failed.
exit /b %ERRORLEVEL%
)
echo build docker image......
start /B /WAIT cmd /c "cd ./hihis-exchange-start && mvn dockerfile:build -T %THREAD% -q -f pom.xml"
if %ERRORLEVEL% neq 0 (
echo Error: mvn clean compile failed.
exit /b %ERRORLEVEL%
)
echo push docker image......
start /B /WAIT cmd /c "cd ./hihis-exchange-start && mvn dockerfile:push -q -f pom.xml"
if %ERRORLEVEL% neq 0 (
echo Error: mvn clean compile failed.
exit /b %ERRORLEVEL%
)
exit /b 0
命令解释
echo set JAVA_HOME:设置maven执行命令时的java版本。防止maven打包时使用的java版本和项目java版本不一致,导致打包失败;例如:@WebMethod在Java 11中被完全删除,项目用java8没问题,但是windows环境变量是java17,这时候maven打包时使用的是java17,就会导致打包失败。
start /WAIT cmd /c “mvn clean -q -f pom.xml”:start表示另起一个cmd窗口执行命令,因为如果不另起一个cmd命令窗口执行,就会导致执行完mvn clean命令后,无法执行下一条mvn package命令了。导致命令提前结束。/WAIT表示等待当前命令执行完才执行下一条start命令。/B表示隐藏另起的cmd窗口,相当于静默执行start命令。
start /B /WAIT cmd /c “mvn package -T %THREAD% -D maven.test.skip=true -P company-repo,dev -q -f pom.xml”:-T启用并行构建设置的是CPU数量,一般建议为系统CPU的一半。-D maven.test.skip=true表示完全禁用测试代码的编译。-P参数是使用profile变量。(如下图所示)-q表示输出error级别的日志到控制台,-f表示使用的pom文件。company-repo是一起使用maven私有仓库和阿里云maven镜像仓库,优先使用私有仓库,当私有仓库找不到依赖时,则去阿里云镜像库找。dev是pom.xml文件配置的开发环境
<profiles>
<profile>
<id>dev</id>
<activation>
<!-- 默认使用dev环境 -->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
start /WAIT cmd /c “cd ./hihis-exchange-start && mvn dockerfile:build -q -f pom.xml”:cd表示进入到子目录,因为maven项目的插件在子目录,因此要先进入到子目录。但是因为start命令是从一个cmd另起一个cmd,当执行完start以后是会关闭当前窗口,回到第一个开启start的窗口的,因此,如果下一个命令还在子目录,则需要重新进入到子目录。mvn dockerfile:build表示使用maven的dockerfile插件使用build命令
start /WAIT cmd /c “cd ./hihis-exchange-start && mvn dockerfile:push -q -f pom.xml”:上面也提到了,start会另起一个cmd窗口,所以当前命令还是在主目录,因此我们要进入到子目录继续执行maven插件dockerfile的push命令
设置IntelliJ IDEA执行bat命令
执行bat命令
推送docker镜像maven插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<!-- 如果是域名,还有在hosts文件配置域名解析 -->
<repository>harbor地址</repository>
<tag>Docker镜像版本号</tag>
<buildArgs>
<!-- 构建参数 -->
<APP_NAME>Docker镜像名称</APP_NAME>
<BASE_JDK>jdk版本号</BASE_JDK>
<BASE_TOMCAT>Tomcat版本号</BASE_TOMCAT>
</buildArgs>
<noCache>true</noCache>
<username>harbor账号</username>
<password>harbor密码</password>
</configuration>
</plugin>
maven编译打包测试
电脑:8核16线程,16G内存。
使用多线程
命令
java -Xmx2048m -Xms1024m -XX:MaxMetaspaceSize=512m -Djava.awt.headless=true -DarchetypeCatalog=internal -Dmaven.test.skip=true -Dmaven.compile.fork=true -T 对应的线程数 compile
毫无疑问单线程最慢,其次2个线程,最快是8线程(电脑线程数的一半),16线程反而比8线程慢,因此并不是线程越多越好。
只输出error日志
因为不输出时间了,用的是idea给出的时间,idea给出的时间会比maven给出的时间慢一点,总体而已,日志只输出error级别,影响不大。看上去比较舒服。
单线程:1分44秒
2线程:1分13秒
4线程:1分03秒
8线程:1分02秒
16线程:1分01秒