当前位置: 首页 > news >正文

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仓库

相关文章:

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

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

程序设计:C++11原子 写优先的读写锁(源码详解二:操作跟踪)

本文承接程序设计&#xff1a;C11原子 写优先的读写锁&#xff08;源码详解&#xff09;-CSDN博客 上文已经列出了完整代码&#xff0c;完整代码里面增加了操作跟踪&#xff0c;这里就讲解一下这部分是如何实现的。 操作跟踪有两个层面&#xff1a;进程层面和线程层面。 由于这…...

Django视图层解析

Django视图&#xff08;View&#xff09;是Django Web框架中负责处理HTTP请求和返回HTTP响应的组件。视图是一段Python代码&#xff0c;接收HTTP请求作为输入&#xff0c;处理请求并返回HTTP响应作为输出。Django视图的主要目的是实现Web应用程序的业务逻辑&#xff0c;将模型和…...

JAVA使用RXTXcomm进行串口通信(一)

首先下载相应的jar文件 压缩包包括:RXTXcomm.jar(64位环境)、win32com.dll和javax.comm.properties。 下载地址:https://www.aliyundrive.com/s/JSeSQsAyYeZ 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需下载极速在线查看&#…...

Vue+ElementUI技巧分享:自定义表单项label的文字提示

文章目录 概要在表单项label后添加文字提示1. 使用 Slot 自定义 Label2. 添加问号图标与提示信息 slot的作用详解1. 基本用法2. 具名插槽 显示多行文字提示的方法1. 问题背景2. 实现多行内容显示3. 样式优化 结语 概要 在Vue和ElementUI的丰富组件库中&#xff0c;定制化表单是…...

【QML】警告Name is declared more than once

1. 问题&#xff1a; qml函数中的不同块中定义同名变量&#xff0c;报警&#xff1a;Name is declared more than once 举例&#xff1a; function test(a){if(a "1"){var re 1;console.log(re);}else{var re 2; //这里会报警&#xff1a;Name is declared mor…...

【自用总结】正项级数审敛法的总结

注&#xff1a;收敛半径的求法就是lim n->∞ |an1/an| ρ&#xff0c;而ρ1/R&#xff0c;最基本的不能忘。 比较判别法&#xff1a;从某项起&#xff0c;该级数后面的项均小于等于另一级数&#xff0c;则敛散性可进行一定的比较 可以看到&#xff0c;比较判别法实际上比较…...

ARMv8平台上安装QT开发环境

安装Qt Creator sudo -iapt-get update apt-get upgrade apt list --installed | grep -v oldstable | cut -d/ -f1 | xargs apt-mark unholdapt-get install gcc g clang make-guile build-essential qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator qt5* 配置…...

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…...

在服务器导出kafka topic数据

使用Kafka自带的工具&#xff1a;Kafka提供了一个命令行工具kafka-console-consumer&#xff0c;可以用来消费指定Topic的数据并将其打印到控制台。 1.打印到控制台 命令如下&#xff1a; kafka-console-consumer.sh --bootstrap-server $kafkaHost --topic $topicName --from-…...

农户建档管理系统的设计与实现-计算机毕业设计源码20835

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设农户建档管理系统。 本…...

uniapp的Vue2,Vue3配置跨域(proxy代理)

vue2 找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff1a;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁止访问本地host文件"port": 8000, //修改项目…...

处理BOP数据集,将其和COCO数据集结合

处理BOP数据集&#xff0c;将其和COCO数据集结合 BOP 取消映射关系&#xff0c;并自增80 取消文件名的images前缀 import os import json from tqdm import tqdm import argparseparser argparse.ArgumentParser() parser.add_argument(--json_path, defaultH:/Dataset/COCO…...

跟李沐学AI-深度学习课程05线性代数

线性代数 &#x1f3f7;sec_linear-algebra 在介绍完如何存储和操作数据后&#xff0c;接下来将简要地回顾一下部分基本线性代数内容。 这些内容有助于读者了解和实现本书中介绍的大多数模型。 本节将介绍线性代数中的基本数学对象、算术和运算&#xff0c;并用数学符号和相应…...

电子病历编辑器源码(Springboot+原生HTML)

一、系统简介 本系统主要面向医院医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c…...

Qt的日志输出

在Qt中&#xff0c;一般习惯使用qDebug信息进行输出和打印调试信息到console或者文件中&#xff0c;在qDebug中&#xff0c;也有一些小技巧&#xff0c;可以帮助我们更好的使用qDebug打印日志记录&#xff0c;本文分享了qDebug使用的一些小技巧。 1. 打印出文件名、行号、调用函…...

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码

基于热交换算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于热交换算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于热交换优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…...

main.js 中的 render函数

按照之前的单组件文件中的写法&#xff0c;我们的写法应该是这样的 import App from ./App.vuenew Vue({el: #app,templete: <App></App>,components: {App}, }) 1、定义el根节点。2、注册App组件。3、渲染 templete 模板 但是在脚手架工程中&#xff0c;他是这…...

Pandas 将DataFrame中单元格内的列表拆分成单独的行

使用 explode 函数 import pandas as pddata {month: [1, 2],week: [[i for i in range(2)], [i for i in range(3)]]} df pd.DataFrame(data) print(df)df df.explode(week) print(df)...

PDF转化为图片

Java 类 PDF2Image 在包 com.oncloudsoft.zbznhc.common.util.pdf 中是用来将 PDF 文件转换为图像的。它使用了 Apache PDFBox 库来处理 PDF 文档并生成图像。下面是类中每个部分的详细解释&#xff1a; 类和方法说明 类 PDF2Image: 使用了 Lombok 库的 Slf4j 注解&#xff0c…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...