环境变量配置远程docker地址

docker 镜像配置maven 环境变量_JAVA

tcp://localhost:2375

docker 镜像配置maven 环境变量_spring boot_02

如果是windows本地打包成docker镜像,则还需要下载docker desktop

《Windows安装Docker Desktop并配置镜像、修改内存占用大小》

docker desktop开启docker远程连接

docker 镜像配置maven 环境变量_JAVA_03

配置镜像追加harbor域名解析

docker 镜像配置maven 环境变量_intellij-idea_04

{
  "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文件

docker 镜像配置maven 环境变量_JAVA_05


把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文件配置的开发环境

docker 镜像配置maven 环境变量_docker_06

<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命令

docker 镜像配置maven 环境变量_spring boot_07


执行bat命令

docker 镜像配置maven 环境变量_spring boot_08


推送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内存。

使用多线程

docker 镜像配置maven 环境变量_JAVA_09

命令

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线程慢,因此并不是线程越多越好。

docker 镜像配置maven 环境变量_spring boot_10

只输出error日志

因为不输出时间了,用的是idea给出的时间,idea给出的时间会比maven给出的时间慢一点,总体而已,日志只输出error级别,影响不大。看上去比较舒服。
单线程:1分44秒
2线程:1分13秒
4线程:1分03秒
8线程:1分02秒
16线程:1分01秒