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

我看了很多关于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仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表操作

1.创建表 创建一个表 表的字符集为utf8&#xff0c;校验规则为utf8_bin 存储引擎为MYisam 2.查看表结构 desc 表名&#xff1b; 3.查看表内容 select * from 表名&#xff1b; 4.查看数据库有几个表 show tables; 附&#xff1a;查看创建表时的语句 show create table 表名…

怎么去掉邮件内容中的回车符

上图是Outlook 截图&#xff0c;可见1指向的总有回车符&#xff1b; 故障原因&#xff1a; 不小心误按了箭头4这个选项&#xff1b; 解决方法&#xff1a; 点击2箭头确保tab展开&#xff1b; 点击3以找到箭头4. 取消勾选或者多次点击&#xff0c;即可解决。

web3资讯及远程工作

各位如果想了解区块链相关的消息可以通过如下网址了解&#xff0c;里面还会有相关职位招聘&#xff08;包括远程工作&#xff09;&#xff0c;还可以在里面进行发帖&#xff0c;进入即可获得1000积分&#xff0c;后期可以兑换一些礼品Cryptosquare

Java简介、基本语法

一、Java简介&#xff1a; Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。 Java主要的特性&#xff1a; 1、Java语言是简单的的&#xff1a; Java语言的语法与C、C语言接近。Java丢弃了C中的一些特性&#xff0c;如操…

android 数独小游戏 经典数独·休闲益智

一款经典数独训练app 标题资源下载 &#xff08;0积分&#xff09;https://download.csdn.net/download/qq_38355313/88544810 首页页面&#xff1a; 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择&#xff1b; 记录页面&#xff1a; 1.记录用户训练过的数独信息&…

HT8313 D/AB切换 音频功率放大器

HT8313具有AB类和D类的自Y切换功能&#xff0c;在受到D类功放EMI干扰困扰时&#xff0c;可随时切换至AB类音频功放模式&#xff08;此时电荷泵升压功能关闭&#xff09;。 HT8313内部固定28dB增益&#xff0c;内置的关断功能使待机电流Z小化&#xff0c;还集成了输出端过流保护…

“说”出一个UI原型稿:来自北邮课堂的一款文心应用

在2023年秋季学期&#xff0c;北京邮电大学联合百度飞桨&#xff0c;设计了“文心一言X产品设计”的集训营主题&#xff0c;并融入到了“移动交互设计”的课程中。在完成结业作业的过程中&#xff0c;同学们将基于文心一言开展产品原型设计与初步开发。 众所周知&#xff0c;产…

容性负载箱与电容器的关系是什么?

容性负载箱用于测试电容器性能的设备&#xff0c;电容器是储存电能的元件&#xff0c;具有储存和释放电荷的能力。容性负载箱通过对电容器施加不同的负载&#xff0c;可以测量电容器的容量、电压响应、损耗等参数。 容性负载箱与电容器的关系主要体现在以下几个方面&#xff1a…

外贸自建站怎么做?做外贸要怎样建设网站?

外贸自建站如何建立&#xff1f;海洋建站的具体步骤有哪些&#xff1f; 通过建立自己的外贸网站&#xff0c;您可以更好地展示公司的产品和服务&#xff0c;吸引更多的潜在客户&#xff0c;提高品牌知名度&#xff0c;拓展海外市场。那么&#xff0c;如何建立一个成功的外贸自…

系列三、GC垃圾回收【总体概览】

一、GC垃圾回收【总体概览】 JVM进行GC时&#xff0c;并非每次都对上面的三个内存区域&#xff08;新生区、养老区、元空间/永久代&#xff09;一起回收&#xff0c;大部分回收的是新生区里边的垃圾&#xff0c;因此GC按照回收的区域又分为了两种类型&#xff0c;一种是发生在新…

6块钱改变世界,网易和拼多多踏入同一条河流?

年底将至&#xff0c;各种颁奖盛典星光熠熠。如果要给今年深蹲反弹中的互联网大厂颁奖&#xff0c;2023表现最突出的可能是师出同门的兄弟网易和拼多多。 从市场表现来看&#xff0c;两家企业录得今年互联网中概股最高涨幅&#xff0c;被称为“中概股之光”&#xff1a;2023年…

移动硬盘打不开?正确操作方法分享!

“我的移动硬盘用了好几年了&#xff0c;但是不知道为什么&#xff0c;最近每次把移动硬盘插入电脑都显示无法打开。我还有一些很重要的数据在里面呢&#xff0c;有什么比较好的方法可以解决这个问题吗&#xff1f;” 作为一个便捷的存储工具&#xff0c;移动硬盘给我们带来了很…

Python plt.scatter()函数用法

一.scatter&#xff08;&#xff09;函数的定义 matplotlib.pyplot.scatter(x, y, sNone, cNone, markerNone, cmapNone, normNone, vminNone, vmaxNone, alphaNone, linewidthsNone, vertsNone, edgecolorsNone, *, dataNone, **kwargs) 特征值作用x&#xff0c;y绘制散点图…

OpenCV快速入门:初探

文章目录 一、什么是OpenCV二、安装OpenCV三、图像读取与显示读取图像显示图像等待按键与关闭窗口 四、视频加载与摄像头调用从视频文件中读取从摄像头中读取关闭窗口与释放资源 五、图像的基本存储方式RGB矩阵矩阵操作与像素访问使用矩阵来显示图像 六、图像保存读取图像保存图…

解决requests 2.28.x版本SSL错误:证书验证失败

1、问题背景 在使用requests 2.28.1版本时&#xff0c;我进行HTTP post传输报告负载时&#xff0c;由于SSL验证设置为True&#xff0c;请求失败&#xff0c;错误如下&#xff1a;(Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certifi…

邀请报名|11月24日阿里云原生 Serverless 技术实践营 深圳站

活动简介 “阿里云云原生 Serverless 技术实践营 ” 是一场以 Serverless 为主题的开发者活动&#xff0c;活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Ser…

高项备考葵花宝典-项目整合管理输入、输出、工具和技术

项目整合管理包括识别、定义、组合、统一和协调项目管理过程组的各个过程和项目管理活动。在项目管理中&#xff0c;整合管理兼具统一、合并、沟通和建立联系的性质&#xff0c;项目整合管理贯穿项目始终。 目录 一、项目整合管理输入、输出、工具和技术 1.1 制定项目章程 1…

7.docker运行redis容器

1.准备redis的配置文件 从上一篇运行MySQL容器我们知道&#xff0c;需要给容器挂载数据卷&#xff0c;来持久化数据和配置&#xff0c;相应的redis也不例外。这里我们以redis6.0.8为例来实际说明下。 1.1 查找redis的配置文件redis.conf 下面这个网址有各种版本的配置文件供…

【教3妹学编程-算法题】最大和查询

3妹&#xff1a;2哥&#xff0c;你有没有看到新闻“18岁父亲为4岁儿子落户现身亲子鉴定” 2哥 : 啥&#xff1f;18岁就当爹啦&#xff1f; 3妹&#xff1a;确切的说是14岁好吧。 2哥 : 哎&#xff0c;想我30了&#xff0c; 还是个单身狗。 3妹&#xff1a;别急啊&#xff0c; 2…

智慧校园电子班牌 智能互联家校互通源码 springboot

利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现生态基础数据共享、应用生态统一管理&#xff0c;为智慧教育建设的统一性&#xff0c;稳定性&#xff0c;可扩展性&#xff0c;互通性提供保障的智慧教育一体化云解决方案。 在大数…