文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java实现Linux(centos) 中docker容器下命令交互的代码(配置向导)

2024-04-02 19:55

关注

开发需求: 因系统程序部署时,经常是拆分部署(多台机器) ,手工部署费时费力,且每次都要手工配置系统参数(系统提供配置向导)。

如下图所示:

1)进行main容器 -> 2)执行系统配置向导 -> 3)选择服务器模式 -> 4) 选择web控制台....然后进行具体的服务器IP设置。

为了解放双手,用java实现了Linux(centos) 下docker 应用程序的命令交互。

具体代码如下:


import java.io.*;
 

public class TestMain extends Thread{
 
    //进入docker main
    private static String [] cmds = {"docker","exec","-i","main","bash"};
    private Process pro;
 
    //初始化各机器IP信息
    private String role = "";
    private String webIp = "";
    private String redisIp = "";
    private String beanstalkdIp = "";
    private String pgIp = "";
 
 
    //main应用重启
    public static String [] cmdRestart = {"/bin/sh","-c","docker restart main"};
 
    public void cmdRun(String[] machines) throws Exception {
        //执行xx系统配置向导命令并生成进程
        //pro = Runtime.getRuntime().exec(cmds);
        ProcessBuilder pb = new ProcessBuilder(cmds);
       
        pro = pb.start();
        System.out.println("执行前pro1:" + pro.isAlive());
 
        //解析machines信息
        if (machines.length > 0) {
            for (int i = 0; i < machines.length; i++) {
                int strEndIndex = machines[i].indexOf(":");
                String str = machines[i].substring(0, strEndIndex);
                String content = machines[i].substring(strEndIndex + 1);
                switch (str.trim()) {
                    case "role":
                        role = content;
                        break; //web服务器IP
                    case "webIp":
                        webIp = content;
                        break;  //redis服务器IP
                    case "redisIp":
                        redisIp = content;
                        break;  //redis服务器IP
                    case "beanstalkdIp":
                        beanstalkdIp = content;
                        break; //beanstalkd服务器IP
                    case "pgIp":
                        pgIp = content;
                        break; //beanstalkd服务器IP
                    default:
                        break;
                }
            }
        }
 
        new Thread() {
            public void run() {
                try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pro.getOutputStream()))) {
                    if (role != null && role.equals("web-server")) {//系统web控制台
                        System.out.println("*********进入web控制台配置向导*********");
                        //系统配置向导命令集-web
                        String[] strCmdWeb = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系统配置向导
                                "server-type", //服务器模式
                                "web-server", //管理服务器:提供管理功能及应用功能
                                "allow-deploy-api-server 0", //设置是否允许部署应用服务器 1允许 0不允许
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "report-server-db-info " + pgIp + ":5432", //设置报表数据库
                                "sfmg-db-info " + pgIp + ":5432", //设置软件管家数据库
                                "web-server-port " + webIp + ":8080",//设置管理服务器端口
                                "commit",//提交
                                "exit"
                        };
 
                        //查看进程是否还存活
                        System.out.println("执行前pro2:" + pro.isAlive());
                        for (String strWeb : strCmdWeb) {
                            synchronized (bw) {
                                bw.write(strWeb.trim());
                                bw.newLine();
                                System.out.println("step: " + strWeb);
                                bw.wait(1000);
                            }
                        }
 
                        //查看进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        bw.close();
                        System.out.println(" bw.close();");
                        System.out.println("web配置向导设置成功!");
 
                    } else if (role != null && role.equals("api-server")) {//系统app应用
                        //系统配置向导命令集-APP
                        System.out.println("*********进入APP服务器控制台配置向导*********");
                        String[] strCmdApp = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系统配置向导
                                "server-type", //服务器模式
                                "api-server", //APP服务器
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "web-server-info " + webIp + ":8080", //设置管理服务器端口
                                "commit",//提交配置
                                "exit"
                        };
 
                        for (String str : strCmdApp) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //查看进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        System.out.println("app配置向导设置成功!");
                        bw.close();
 
                    } else if (role != null && role.equals("log-analyze-server")) {//系统日志分析服务器
                        //系统配置向导命令集-log-analyze-server
                        System.out.println("*********进入日志分析服务器控制台配置向导*********");
                        String[] strCmdLog = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//天擎配置向导
                                "server-type", //服务器模式
                                "log-analyze-server", //管理服务器:提供管理功能及应用功能
                                "cache-info " + redisIp + ":6379", //缓存服务器
                                "db-info " + pgIp + ":5432", //设置数据库信息
                                "queue-info " + beanstalkdIp + ":11300", //设置队列信息
                                "web-server-info " + webIp + ":8080", //设置管理服务器端口
                                "sfmg-db-info " + pgIp + ":5432", //设置软件管家数据库
                                "commit",//提交配置
                                "exit"
 
                        };
 
                        //顺序执行配置向导命令
                        for (String str : strCmdLog) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //测试进程是否还存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//缓存提交
                        System.out.println("缓存提交!");
                        System.out.println("日志分析服务器配置向导设置成功!");
                        bw.close();
                    }
 
                } catch (IOException | InterruptedException e) {
                    //pro.destroyForcibly();
                    e.printStackTrace();
                    //pro.destroy();
                    System.out.println("e.getMessage(): " + e.getMessage());
                } finally {
                    try {
                        Process process = Runtime.getRuntime().exec(cmdRestart);//重启main
                        System.out.println("process.isAlive:" + process.isAlive());
                        System.out.println("重启main成功!");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
 
 
        new Thread(){
            public void run(){
                BufferedReader br = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
                String cmdout = "";
                try {
                    cmdout = br.readLine();
                    while(cmdout!= null&&(!cmdout.equals("exit"))){
                        System.out.println(cmdout);
                    }
                } catch (IOException e) {
                    //System.out.println("br:pro.destroy();");
                    //pro.destroy();
                    e.printStackTrace();
                    System.out.println("e.printStackTrace();");
                }
                try {
                    System.out.println(" br.close();");
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        pro.waitFor();//进程等待
    }
 
    public static void main(String[] args) throws Exception {
 
        TestMain testMain = new TestMain();
 
        
 
        testMain.cmdRun(args);
       
    }
}

特别注意:


 private static String [] cmds = {"docker","exec","-i","main","bash"};

一定要使用 docker exec -i main bash ,不要使用 -it ,否则会报错 cannot enable tty mode on non tty input。


Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
 
Run a command in a running container
 
  -i, --interactive=false    Keep STDIN open even if not attached  
  -t, --tty=false            Allocate a pseudo-TTY

打成jar包,执行jar包:

终于看到久违的部署成功界面~

到此这篇关于java实现Linux(centos) 中docker容器下命令交互(配置向导)的文章就介绍到这了,更多相关docker容器命令交互内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯