Docker自动从Harbor下更新镜像

2023-05-16

JAVA开发Docker容器下自动更新镜像仓库的工具

在这里插入图片描述
前段时间在做一套分布式多租户系统,它包括控制平台和应用服务器两部分,应用服务器为企业客户服务,系统会为每家企业建立一个应用服务器实例,它存在于容器中,控制平台用于管理所有的应用服务器引流和访问控制(本文不是重点)。系统V1版发布后,运维将jar包打成镜像,再将镜像push 到harbor服务器中,应用服务器再从harbor服务器拉取镜像实例,放到docker容器运行,命令为:

    docker pull harbor.hyj.com/imes/imes:2.2.62            #拉取新版本镜像
	docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.62	   		 #实例容器,并启动

当有新版本jar包发布后,需将原容器停掉,再另外新启一个容器

  docker pull harbor.hyj.com/imes/imes:2.2.62            #拉取新版本镜像
  docker ps            #查看所有运行容器信息
  docker stop containid           #停止运行容器
  docker rm containid           #删除已运行容器
  docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.62   		 #重新拉取新版本容器镜像

规模变大

现假设镜像imes在docker下部署了N个容器实例,当镜像版本更新后,若要更新原有服务器容器,需对每个容器实例进行docker stop->docker rm->docker start的一系列操作,同时确保和原端口一致,并重复操作N次,原命令:

容器A:

docker stop container1A
docker rm container1A
docker run ....... 

容器2:

docker stop container1B
docker rm container1B
docker run ....... 

容器N

docker stop container1N
docker rm container1N
docker run ....... 

如此下去,运维工作非常麻烦

解决工具

为了节省运维的时间,以上过程可通过PubTool.jar一键提交,让计算机自己去完成替换N个容器的操作:
使用PubTool.jar的前提,linux系统下,服务器具备java环境
例如:imes应有服务镜像已部署容器如下:
在这里插入图片描述
现开发人员已对imes进行版本升级,升级到imes:2.2.62,需更新所有的容器服务器,输入如下命令:
java -jar PubTool.jar harbor.hyj.com/imes/imes:2.2.62
在这里插入图片描述

实现源代码

发布工具类PubTool.java

public class PubTool {
    public static void main(String[] args) {
        String res=exeCmd("docker ps");
        String arr[]=res.split("\n");
        List<DockerEntity> dockerEntities=new ArrayList<>();
        for(int i=0;i<arr.length;i++) {
            if(i==0)
                continue;
            String []runDockerinfo=arr[i].split("   ");
            String dockerRealInfo[]=new String [8];
            int temmindex=0;
            for(int j=0;j<runDockerinfo.length;j++){

                runDockerinfo[j]=runDockerinfo[j].replaceAll(" ","").replaceAll("   ","").replaceAll("\t","");
                if(!runDockerinfo[j].equals(" ")&&!runDockerinfo[j].equals("")) {
                    dockerRealInfo[temmindex++] = runDockerinfo[j];
                    System.out.print(j + ": " + runDockerinfo[j] + " ;");
                }
            }
            DockerEntity dockerEntity=new DockerEntity(dockerRealInfo);
            dockerEntities.add(dockerEntity);
            System.out.println("\nGet docker datas: "+dockerRealInfo[0]);
            if(dockerEntity.getImage().contains("hyj")){
                System.out.println("stop container "+dockerEntity.getContainer());
                String res1=exeCmd("docker stop "+dockerEntity.getContainer());
                System.out.println(res1);
                System.out.println("rm container "+dockerEntity.getContainer());
                String res2=exeCmd("docker rm "+dockerEntity.getContainer());
                System.out.println(res2);
//              docker run -d -p 8888:8080 harbor.hyj.com/imes/imes:2.2.61
                System.out.println("start container ");
                String portstr=dockerEntity.getPort();
                portstr=portstr.substring(portstr.indexOf(':')+1,portstr.indexOf(':')+11);
                String res3=exeCmd("docker run -d -p "+portstr.replaceAll("->",":")+" "+args[0]);
                System.out.println(res3);
            }
        }

    }
    public static String exeCmd(String commandStr) {

        String result = null;
        try {
            String[] cmd = new String[]{"/bin/sh", "-c",commandStr};
            Process ps = Runtime.getRuntime().exec(cmd);

            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                //执行结果加上回车
                sb.append(line).append("\n");
            }
            result = sb.toString();


        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;

    }

}

运行容器基本信息存储类DockerEntity

public class DockerEntity {
    String container ;
    String image;
    String command;
    String created;
    String status;
    String port;
    String names;

    public DockerEntity(String []arr){
        container=arr[0];
        image=arr[1];
        command=arr[2];
        created=arr[3];
        status=arr[4];
        port=arr[5];
        names=arr[6];
    }
    public String getContainer() {
        return container;
    }

    public void setContainer(String container) {
        this.container = container;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public String getCreated() {
        return created;
    }

    public void setCreated(String created) {
        this.created = created;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    public String getNames() {
        return names;
    }

    public void setNames(String names) {
        this.names = names;
    }

    public static void main(String[] args) {
        System.out.println(":8886->8080".substring("sdadsads:8886->8080".indexOf(':')+1,10).replace("->",":"));
    }
}

如有疑问或建议,请联系我,QQ:2414941795

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker自动从Harbor下更新镜像 的相关文章

随机推荐

  • vim常用的功能

    vim是vi 的升级版本 xff0c 它兼容vi的所有指令 xff0c 而且还有一些新的特性 xff0c 比如说预付高亮 可视化操作不仅可以在终端进行 xff0c 还可以在 x Window mac os windows vim 有多种模式
  • vscode electron安装环境

    1 安装nodejs Node js 安装18 12 1LTS版本 安装完成后确认 node version 2 安装electron npm install electron g 验证是否安装成功 electron v 没成功 xff01
  • Debug和Release的区别以及obj文件的作用

    Debug和Release的区别 Debug xff1a 调试版本 xff0c 包含调试信息 xff0c 所以容量比release大很多 xff0c 并且不进行任何优化 xff0c xff08 优化会使调试复杂化 xff0c 因为进行优化肯
  • python中的import、from import以及import as的区别

    首先介绍一下import和include的区别或者说import相对include的好处 xff1a import导入的内容只会被包含一次 xff0c 在引入之前会检测是否已经存在该模块 xff0c 不存在才会被引入 xff0c 而incl
  • error while loading shared libraries: lib*.so: cannot open shared object file: No such file

    linux在编译文件时报错 xff1a slam sample error span class token keyword while span loading shared libraries libslam common so can
  • (1/100) ros的plugin插件和动态参数配置dynamic_reconfigure

    写在前面 xff1a 实际机器人开发中 xff0c 往往会存在很多参数 xff0c 这些参数需要在实际的调试中得出 xff0c 为了更高效的开发与测试 xff0c 则选择使用动态的参数配置 而在机器人功能模块层面 xff0c 我们可能也需要
  • 重定向printf函数到串口输出的多种方法

    本文详细的介绍了如何重定向printf输出到串口输出的多种方法 xff0c 包括调用MDK微库 xff08 MicroLib xff09 的方法 xff0c 调用标准库的方法 xff0c 以及适用于 GNUC 系列编译器的方法 1 prin
  • 如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 xff08 比如 win32 Disk Imager xff09 向SD卡烧写镜像文件时 xff0c 很有可能出现烧写失败的情况 xff0c 通常如果烧写失败 xff0c 系统会弹出请求格式化SD卡的提示框 此时不要点格
  • FreeRTOS学习笔记(一)基础篇

    我的FreeRTOS学习 xff0c 是从朱工的FreeRTOS系列博客开始的 xff0c 感谢朱工的悉心整理 xff0c 文章很不错 xff0c 适合学习 根据朱工的博客 xff0c 按照我自己的习惯和思路 xff0c 把最关键的信息抓取
  • 程序员要不要懂底层原理

    我在做编程的时候 xff0c 还是一个地道的门外汉 xff0c 就像一个刚出生的孩子 xff0c 跟着大人咿呀呀的学语 xff0c 也不知道是什么 xff0c 做什么用的 xff0c 也不知道能不能换种方式实现 xff0c 总结起来就是一问
  • Z变换零点极点

    在Z变换里 xff0c 零点的位置表示系统的 谷 xff0c 极点的位置表示系统的 峰 xff0c 我们把有峰的地方看做信号可以通过的地方 xff0c 而有谷的地方看做信号被截止的地方 并且我们选择单位圆为频域的一个周期 xff0c 那么可
  • ubuntu16.04下ROS Kinetic详细安装过程

    参考网址 xff1a 点击打开链接 参考文献 xff1a ROS机器人编程 配置环境 xff1a ubuntu 16 04 LTS 43 ROS Kinetic 一 安装ROS 1 设置镜像源 为了保证安装速度 xff0c 需要选择国内的镜
  • vscode环境中配置git

    1 建立project空目录用于存放electron基本环境这个环境中得文件不能加入git项目中否则每次更新文件太大github不支持大于100M得文件上传 2 使用vscode打开project目录 3 打开终端运行npm install
  • idea 主题 代码颜色 代码区背景 行号背景 注释颜色修改

    最近写代码眼睛总是看的不舒服 xff0c 想着换一个主题 xff0c 但是换了主题 xff0c 代码的颜色显示和之前又不一样了 xff0c 接下来就是修改主题 xff0c 但是代码颜色仍然保持 Darcula 主题的颜色 目录 1 修改主题
  • RTT之SysTick做了什么

    经过好几天的摸索 xff0c 终于正常驱动了一个串口设备 xff0c 并成功移植到雅特力的板子上 xff01 当然 xff0c 还得继续努力把RTT的内核搞清楚 xff0c 这样才会构建整个项目程序 xff0c 毕竟项目是有时间限制的 因为
  • realSense 安装 经验整理

    安装 RealSense SDK 以ros 参考1 参考二 主要看参考三 标定 标定 以上内容安装失败 Realense sdk和ros对应关系 jetson jetson 一键安装sdk 官方安装 jetson4 4 xavier nx
  • 吴恩达machine learning yearning读书笔记1

    在 setting up development set and test set 这一章中 xff0c 作者提到了一个很重要的问题 训练集和测试集分布不一致导致的机器学习模型泛化能力有限 xff1a 在训练集上表现比较好 xff0c 但是
  • 图像畸变与去畸变

    本文主要介绍图像畸变产生的原因 xff0c 广角镜头的一般畸变模型和去畸变的方法 1 图像畸变 图像畸变是由于透镜制造精度以及组装工艺的偏差会引入畸变 xff0c 导致原始图像失真 镜头的畸变分为径向畸变和切向畸变两类 1 1 径向畸变与畸
  • Linux C编程问题:symbol lookup error: xxx undefined symbol xxx

    程序代码在编译的时候没问题 xff0c 但是在运行的时候报错 xff1a bin symbol lookup error bin undefined symbol xxx 百度了一下 xff0c 貌似是程序运行时使用的动态库和编译时make
  • Docker自动从Harbor下更新镜像

    JAVA开发Docker容器下自动更新镜像仓库的工具 前段时间在做一套分布式多租户系统 xff0c 它包括控制平台和应用服务器两部分 xff0c 应用服务器为企业客户服务 xff0c 系统会为每家企业建立一个应用服务器实例 xff0c 它存