idea一键打包docker镜像并推送远程harbor仓库的方法(包含spotify和fabric8两种方法)--全网唯一正确,秒杀99%水文

news/2024/12/23 5:02:18/

我看了很多关于idea一键打包docker镜像并推送harbor仓库的文章,不论国内国外的,基本上99%都是瞎写的, 这些人不清楚打包插件原理,然后就是复制粘贴一大篇,写了一堆垃圾,然后别人拿来也不能用。

然后这篇文章是经过我无数次测试、踩坑后得出宝贵经验,然后在此分享给各位!

首先谈第一个问题: idea的docker插件不是必须安装的!

我看了那么多傻吊写的文章:在maven插件里面配了一大堆的harbor仓库的认证信息,结果

mvn clean package 以后,发现只能打包docker镜像没有push推送成功!

也就是:你要推送镜像还得使用docker插件, 总共需要两步才能完成docker镜像的打包和推送!

像下面这样:

 这他妈叫一键推送吗?!

所以我发誓一定要研究出一套真正意义上的idea一键打包推送docker镜像的方法。

我这里提供com.spotify和io.fabric8两种方法是绝对可以使用的

两种方法都需要开启docker 2375端口.

注意:远程docker和远程harbor仓库是两个概念

因为你打包docker镜像和push推送都需要一个docker程序,而idea需要一个能远程控制docker的机制,这就是开启远程docker 2375端口的原因。

而远程harbor仓库,说白了就是你打包后docker镜像存储的地方,仅此而已。

关于搭建harbor仓库的方法可以参看我的一篇文章: centos搭建docker镜像Harbor仓库的简明方法-CSDN博客

开启开启远程docker 2375端口的方法有两种:

1. 在/etc/docker/daemon.json文件中加入: 

 "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"] 然后重启docker

第二种方法:编辑/usr/lib/systemd/system/docker.service文件

在ExecStart=/usr/bin/dockerd 后面增加 -H tcp://0.0.0.0:2375 

然后运行命令:

systemctl daemon-reload

systemctl restart docker

首先谈第一种方法: com.spotify出品的dockerfile-maven-plugin插件,

pom.xml核心配置如下:

<properties>
    <!-- docker镜像的版本号  -->
    <image.tag.verion>v1.0.1</image.tag.verion>
    <!-- 远程harbor仓库的域名地址 -->
    <docker.repostory>harbor.myhub.com</docker.repostory>
</properties>
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.4.13</version>
    <executions>
        <execution>
            <id>default</id>   
<!--    maven打包阶段就触发dockerfile-maven-plugin插件的以下动作   -->
            <phase>package</phase>
            <goals>
                <goal>build</goal>
                <goal>tag</goal>
                <goal>push</goal>
            </goals>
            <configuration>
             <!-- 给docker镜像打上版本号 -->
                <tag>${image.tag.verion}</tag>
            </configuration>
        </execution>

    </executions>
    <configuration>
           <!-- 指定dockerfile所在目录 -->
        <contextDirectory>${project.basedir}</contextDirectory> 
         <!-- 指定docker镜像名,格式必须这样写,  注意:这里${docker.repostory}仓库地址必须有,因为docker需要这个去连接你真实仓库地址,否则就会连接到官方的docker.io仓库了, 镜像名称格式是:harbor仓库域名/子仓库/镜像名称,版本号由上面的tag动作标注 -->
        <repository>${docker.repostory}/library/${project.artifactId}</repository>
         <!-- 连接远程harbor仓库的用户名和密码 -->
        <username>admin</username>
        <password>Harbor12345</password>
         <!-- 传递环境变量:JAR_FILE给dockerfile -->
        <buildArgs>
            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>

    </configuration>
</plugin>

这里有个特别需要注意地方:repository标签,也就是push到harbor仓库的镜像名称,

必须是这种格式: harbor仓库域名/子仓库/镜像名称

如果不这样写: 就会推送到官方docker.io仓库!

另外需要在IDEA的maven中配置DOCKER_HOST环境变量:

这个DOCKER_HOST是指安装有docker的机器,并且需要开启2375端口。

不建议在本地windows安装docker,因为它本质上还是搞一个虚拟机跑docker,没必要。

然后是dockerfile的内容:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE # 接收pom.xml文件传递的变量
# 注意WORKDIR指向的目录必须提前存在,否则后面复制文件的时候会失败,导致容器无法运行
RUN echo "JAR_FILE is: ${JAR_FILE}" && mkdir /app
WORKDIR /app
COPY target/${JAR_FILE} ./app.jar
RUN echo "ls result" && ls -l /app
ENTRYPOINT ["java", "-Dfile.encoding=UTF-8", "-jar", "app.jar"]

注意点:

1. WORKDIR指向的目录必须提前存在,否则后面复制文件的时候会失败,导致容器无法运行, 会报错:Error: Invalid or corrupt jarfile app.jar.

原因:WORKDIR 指令是设置工作目录,但并不会在文件系统中创建目录。

2. 同时,这里通过pom 文件的buildArgs标签传递JAR_FILE变量,然后在dockerfile里面通过ARG JAR_FILE来接收变量,目的是不把idea打包的jar文件名写死,实现动态化传参

3. 第三点:dockerfile必须放在当前项目的根目录,也就是pom文件的同级目录,如果不这样,那么dockerfile执行COPY指令时就需要使用COPY ../target/${JAR_FILE} ./app.jar, 因为COPY指令的路径是dockerfile所在路径,如果dockerfile在子目录,就必须向外层寻找jar文件的构建目录也就是target目录

4.  pom文件中的项目最顶层的artifactId必须是小写,否则docker镜像构建不能成功,会报错:xxx must contain only lowercase, numbers, '-', '_' or '.'.

第二种方法:io.fabric8出品的docker-maven-plugin插件

io.fabric8不需要在IDEA配置DOCKER_HOST环境变量,因为它在pom文件中有自带dockerHost字段,能够指定远程docker地址。

pom.xml核心配置如下:

<properties><!-- docker镜像的版本号  --><image.tag.verion>v1.0.1</image.tag.verion><!-- 远程harbor仓库的域名地址 --><docker.repostory>harbor.myhub.com</docker.repostory>
</properties>  <plugin><groupId>io.fabric8</groupId><artifactId>docker-maven-plugin</artifactId><version>0.43.4</version><executions><execution><id>default</id><!--用户只需执行mvn package ,就会自动执行mvn docker:build/push动作--><phase>package</phase><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><!-- 指定远程habor仓库的域名地址   --><registry>${docker.repostory}</registry><authConfig><!-- 指定远程habor仓库的登录用户名和密码   --><username>admin</username><password>Harbor12345</password></authConfig><images>               <image><!-- --指定生成的镜像名, 必须这样写,  注意:这里${docker.repostory}仓库地址必须有,因为docker需要这个去连接你真实仓库地址,否则就会连接到官方的docker.io仓库了,镜像名称格式是:harbor仓库域名/子仓库/镜像名称:版本号 --><name>${docker.repostory}/library/${project.artifactId}:${image.tag.verion}</name><build><!-- 指定dockerfile所在的目录          --><contextDir>${project.basedir}</contextDir></build></image></images><!--指定远程 docker daemon地址--><dockerHost>http://192.168.10.30:2375</dockerHost><!--  传递环境变量:JAR_FILE给dockerfile    --><buildArgs><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin>

然后dockerfile也是必须在项目根目录,内容跟上面的一样。

最后使用maven测试一下docker镜像的打包和推送功能:

 

 

 

 

 以上已经成功验证了idea一键打包docker镜像并推送到harbor仓库


http://www.ppmy.cn/news/1222650.html

相关文章

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

layui表头多出一列(已解决)

问题描述 &#xff1a;layui表头多出来一列&#xff0c;但是表体没有内容&#xff0c;很影响美观。 好像是原本的表格有滚轮&#xff0c;我操作放大之后滚轮没有了&#xff0c;但是滚轮自带的表头样式还在&#xff0c; 之后手动把这个样式隐藏掉了&#xff0c;代码如下&#xf…

GAT里面的sofamax函数的实现:

1.sofamx 公式&#xff1a; 2. GAT里的sofamax函数的实现&#xff1a; 1. 因为指数在x轴正轴爆炸式地快速增长&#xff0c;如果zi比较大&#xff0c;exp⁡(zi)也会非常大&#xff0c;得到的数值可能会溢出。溢出又分为下溢出&#xff08;Underflow&#xff09;和上溢出&#x…

git 指定时间代码统计

指定时间代码统计 用法 13 - 17 号 代码情况 近一周 git log --since2023-11-13 00:00:00 --until2023-11-17 23:00:00 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s, removed lines: %s,total lines: %s\n&…

开源电子画册源码系统 可重复利用 适合任何行业 带完整的搭建教程

电子画册&#xff0c;又称电子样本、电子商刊、电子杂志&#xff0c;是一种集合图片处理、文案策划、音乐加工、视频、统计调查、虚拟现实、三维动画等多种技术和表现形式为一体的多媒体画册&#xff0c;电子杂志是纸质印刷画册&#xff08;样本&#xff09;的升级版本&#xf…

vscode开发相关

## 开发工具vscodehttps://code.visualstudio.com/https://marketplace.visualstudio.com/items?itemNameesbenp.prettier-vscodehttps://marketplace.visualstudio.com/items?itemNamesdras.vue-vscode-extensionpackhttps://marketplace.visualstudio.com/items?itemNamej…

浅谈vue2.0和vue3.0的区别

Vue3.0相对于Vue2.0有以下改进&#xff1a; Vue 3.0 是一个新版本的 Vue.js&#xff0c;它提供了更高效的渲染性能和更强大的工具链。下面是一些 Vue 3.0 的具体用法&#xff1a; 创建 Vue 实例&#xff1a;与 Vue 2.x 相同&#xff0c;使用 Vue.createApp() 方法创建 Vue 实例…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…