• 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核心配置如下:


       
        v1.0.1
       
        harbor.myhub.com


        com.spotify
        dockerfile-maven-plugin
        1.4.13
       
           
                default   

                package
               
                    build
                    tag
                    push
               

               
                 
                    ${image.tag.verion}
               

           

       
       
              
            ${project.basedir} 
             
            ${docker.repostory}/library/${project.artifactId}
             
            admin
            Harbor12345
             
           
                ${project.build.finalName}.jar
           

       

    这里有个特别需要注意地方: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核心配置如下:

    
        
        v1.0.1
        
        harbor.myhub.com
      
     
            io.fabric8
            docker-maven-plugin
            0.43.4
            
                
                    default
              
                    package
                    
                        build
                        push
                    
                
            
    
            
               
                ${docker.repostory}
                
                  
                    admin
                    Harbor12345
                
                               
                    
                  
                        ${docker.repostory}/library/${project.artifactId}:${image.tag.verion}
                        
                       
                            ${project.basedir}
                        
                    
                
                
                http://192.168.10.30:2375
                
                
                    ${project.build.finalName}.jar
                
            
        

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

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

     

     

     

     

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

  • 相关阅读:
    http1和http2的主要区别
    ubuntu安装docker及 kubectl
    如何获得jd商品分类API数据
    基于C++的开源库dxflib 解析dxf文件
    Docker基于本地文件安装Nacos单机版
    软考 系统架构设计师系列知识点之软件架构风格(4)
    sqlyon连接mysql碰到的问题及mysql卸载须注意的地方
    在Ubuntu20.04中安装中文输入法
    React 学习笔记:JSX 语法
    复习C部分:三大循环while篇(内含continue(常用场景2)和break(常用场景1)介绍和使用详情)
  • 原文地址:https://blog.csdn.net/jiaohuizhuang6019/article/details/134446970