企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # dockerfile-maven-plugin 插件使用 参考:[Spotify官方推荐Maven插件构建Docker镜像](https://zhuanlan.zhihu.com/p/90122357) [项目地址](https://github.com/spotify/dockerfile-maven) 这是一个将Docker与Maven无缝集成的Maven插件,可以方便地使用Maven打包Docker image **设计目标:** * 插件使用Dockerfile构建Docker项目,将Docker构建过程集成到Maven构建过程中。 * 使用mvn package构建项目,会同时完成Docker镜像构建。 * 使用mvn deploy推送jar包时,dockedr镜像同时会被push。 * 也可以用`mvn dockerfile:build`和`mvn dockerfile:push`单独构建和推送docker镜像。 >该插件需要Java 7或更高版本以及Apache Maven 3或更高版本。 >要运行集成测试或在开发中使用该插件,需要有一个能正常工作的Docker。 ## A 实际使用案例 **项目环境说明:** 1. docker仓库是使用harbor搭建的可视化私有仓库 2. 本机是win10企业版,开启hpyer-v,安装docker desktop环境 3. 开启本机docker的2375api上传端口 4. 需要手动编写dockerfile,与pom文件同级 5. java项目的pom文件需要修改两个模块 ### 1. 修改pom的**properties**模块 该模块中需要增加插件版本号以及docker仓库的地址 ``` <properties> ........pom文件原有内容省略........ <dockerfile.maven.version>1.4.3</dockerfile.maven.version> <docker.registry.name.prefix>harbor.zhimai168.com:1234/test</docker.registry.name.prefix> </properties> ``` ### 2. 修改pom**plugins**模块 该模块增加插件详细配置 ``` <build> <plugins> <plugin> ........其他插件的配置信息,略........ </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile.maven.version}</version> <dependencies> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>${docker.registry.name.prefix}/${project.artifactId}</repository> <tag>${project.version}</tag> <username>admin</username> <password>xxxxxxxx</password> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> </plugins> </build> ``` repository指定docker镜像的repo名字。 tag指定docker镜像的tag。 buildArgs可以指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用。 **特别说明:** 1. 不要使用1.4.0版本,该版本有bug,不能上传到私有仓库 2. 如果注释掉goals内代码,package打包时就不会构建docker镜像 3. docker仓库账号密码放在配置中有一定危险性,还好harbor有机器人账户,只能推拉,不能登录 4. 暂时未找到同时给一个镜像打多个tag的方法 ### 3.创建dockerfile ``` FROM openjdk:8-jre #添加本地jar包 RUN mkdir -p /home/admin/app/ RUN mkdir -p /home/admin/tomcat/ ENV CATALINA_HOME /home/admin/tomcat/ ARG JAR_FILE ADD target/${JAR_FILE} /home/admin/app/ # 将启动命令写入启动脚本 start.sh RUN echo "$JAVA_HOME/bin/java -jar $JAVA_OPTS -Ddubbo.address.ip=$POD_IP -Djava.security.egd=file:/dev/./urandom /home/admin/app/${JAR_FILE} --spring.profiles.active=prod" > /home/admin/start.sh && chmod +x /home/admin/start.sh WORKDIR $CATALINA_HOME ENTRYPOINT ["/bin/bash", "/home/admin/start.sh"] ``` ### 4.构建具体命令 构建命令: 1. 打jar包并构建docker镜像 mvn package 2. 仅构建docker镜像 mvn dockerfile:build 3. 一键打包并推送 mvn deploy 如果maven私库未配置或不能推送,会报错 4. 仅推送docker镜像 mvn dockerfile:push 仅推送docker镜像,不推送jar包到私库 ## B 其他细节 ### 1. 加密docker仓库密码 从版本1.3.6开始,可以使用maven的 settings.xml文件进行身份验证,而不是使用docker配置。 先在pom文件周,添加类似于以下配置: ``` <configuration> <repository>docker-repo.example.com:8080/organization/image</repository> <tag>latest</tag> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> </configuration> ``` 然后再在mave的setting文件中,添加服务器配置 ``` <servers> <server> <id>docker-repo.example.com:8080</id> <username>me</username> <password>mypassword</password> </server> </servers> ``` 由于setting是maven本地文件,不会提交到代码库,有一定程度的保密作用 ### 2.跳过docker构建命令 | 命令 | 用途 | | --- | --- | | dockerfile.skip | 跳过整个dockerfile插件 | | dockerfile.build.skip | 跳过docker构建步骤 | | dockerfile.tag.skip | 跳过docker打tag步骤 | | dockerfile.push.skip | 跳过docker推送步骤 | 例如,跳过整个dockerfile插件: `mvn clean package -Ddockerfile.skip` ### 3. 将docker打包的镜像不存放在本机 如果不想把构建的镜像存放在本机,例如存放到专用的docker打包服务器上,可以开启docker的2378端口, 然后再本机(开发期)修改环境变量`DOCKER_HOST` 为`tcp://xxxx:2375`即可 >2375是为Docker开启的远程访问API的端口,如果你开启的是其他端口,请使用具体的端口。如果你的Docker没有开启远程访问API,请自行Google开启。 linux修改环境变量方法 ``` export DOCKER_HOST=tcp://localhost:2375 ```