最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)Linux(centos) 中docker容器下命令交互的代碼(配置向?qū)В?/h1>
 更新時間:2021年05月13日 15:14:57   作者:見賢思齊IT  
小編在開發(fā)項(xiàng)目時遇到個需求,因?yàn)橄到y(tǒng)部署每次都要多臺機(jī)器拆分部署,很麻煩,怎么配置比較方便呢,今天小編給大家介紹java實(shí)現(xiàn)Linux(centos) 中docker容器下命令交互的代碼(配置向?qū)В信d趣的朋友一起看看吧

開發(fā)需求: 因系統(tǒng)程序部署時,經(jīng)常是拆分部署(多臺機(jī)器) ,手工部署費(fèi)時費(fèi)力,且每次都要手工配置系統(tǒng)參數(shù)(系統(tǒng)提供配置向?qū)?。

如下圖所示:

1)進(jìn)行main容器 -> 2)執(zhí)行系統(tǒng)配置向?qū)?-> 3)選擇服務(wù)器模式 -> 4) 選擇web控制臺....然后進(jìn)行具體的服務(wù)器IP設(shè)置。

為了解放雙手,用java實(shí)現(xiàn)了Linux(centos) 下docker 應(yīng)用程序的命令交互。

具體代碼如下:

import java.io.*;
 
/**
 * @author by dujiajun
 * @date 2021/4/29.
 */
public class TestMain extends Thread{
 
    //進(jìn)入docker main
    private static String [] cmds = {"docker","exec","-i","main","bash"};
    private Process pro;
 
    //初始化各機(jī)器IP信息
    private String role = "";
    private String webIp = "";
    private String redisIp = "";
    private String beanstalkdIp = "";
    private String pgIp = "";
 
 
    //main應(yīng)用重啟
    public static String [] cmdRestart = {"/bin/sh","-c","docker restart main"};
 
    public void cmdRun(String[] machines) throws Exception {
        //執(zhí)行xx系統(tǒng)配置向?qū)畈⑸蛇M(jìn)程
        //pro = Runtime.getRuntime().exec(cmds);
        ProcessBuilder pb = new ProcessBuilder(cmds);
       /* pb.inheritIO();
        pb.redirectErrorStream(true);*/
        pro = pb.start();
        System.out.println("執(zhí)行前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服務(wù)器IP
                    case "webIp":
                        webIp = content;
                        break;  //redis服務(wù)器IP
                    case "redisIp":
                        redisIp = content;
                        break;  //redis服務(wù)器IP
                    case "beanstalkdIp":
                        beanstalkdIp = content;
                        break; //beanstalkd服務(wù)器IP
                    case "pgIp":
                        pgIp = content;
                        break; //beanstalkd服務(wù)器IP
                    default:
                        break;
                }
            }
        }
 
        new Thread() {
            public void run() {
                try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(pro.getOutputStream()))) {
                    if (role != null && role.equals("web-server")) {//系統(tǒng)web控制臺
                        System.out.println("*********進(jìn)入web控制臺配置向?qū)?********");
                        //系統(tǒng)配置向?qū)罴?web
                        String[] strCmdWeb = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系統(tǒng)配置向?qū)?
                                "server-type", //服務(wù)器模式
                                "web-server", //管理服務(wù)器:提供管理功能及應(yīng)用功能
                                "allow-deploy-api-server 0", //設(shè)置是否允許部署應(yīng)用服務(wù)器 1允許 0不允許
                                "cache-info " + redisIp + ":6379", //緩存服務(wù)器
                                "db-info " + pgIp + ":5432", //設(shè)置數(shù)據(jù)庫信息
                                "queue-info " + beanstalkdIp + ":11300", //設(shè)置隊(duì)列信息
                                "report-server-db-info " + pgIp + ":5432", //設(shè)置報(bào)表數(shù)據(jù)庫
                                "sfmg-db-info " + pgIp + ":5432", //設(shè)置軟件管家數(shù)據(jù)庫
                                "web-server-port " + webIp + ":8080",//設(shè)置管理服務(wù)器端口
                                "commit",//提交
                                "exit"
                        };
 
                        //查看進(jìn)程是否還存活
                        System.out.println("執(zhí)行前pro2:" + pro.isAlive());
                        for (String strWeb : strCmdWeb) {
                            synchronized (bw) {
                                bw.write(strWeb.trim());
                                bw.newLine();
                                System.out.println("step: " + strWeb);
                                bw.wait(1000);
                            }
                        }
 
                        //查看進(jìn)程是否還存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//緩存提交
                        System.out.println("緩存提交!");
                        bw.close();
                        System.out.println(" bw.close();");
                        System.out.println("web配置向?qū)гO(shè)置成功!");
 
                    } else if (role != null && role.equals("api-server")) {//系統(tǒng)app應(yīng)用
                        //系統(tǒng)配置向?qū)罴?APP
                        System.out.println("*********進(jìn)入APP服務(wù)器控制臺配置向?qū)?********");
                        String[] strCmdApp = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//系統(tǒng)配置向?qū)?
                                "server-type", //服務(wù)器模式
                                "api-server", //APP服務(wù)器
                                "cache-info " + redisIp + ":6379", //緩存服務(wù)器
                                "db-info " + pgIp + ":5432", //設(shè)置數(shù)據(jù)庫信息
                                "queue-info " + beanstalkdIp + ":11300", //設(shè)置隊(duì)列信息
                                "web-server-info " + webIp + ":8080", //設(shè)置管理服務(wù)器端口
                                "commit",//提交配置
                                "exit"
                        };
 
                        for (String str : strCmdApp) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //查看進(jìn)程是否還存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//緩存提交
                        System.out.println("緩存提交!");
                        System.out.println("app配置向?qū)гO(shè)置成功!");
                        bw.close();
 
                    } else if (role != null && role.equals("log-analyze-server")) {//系統(tǒng)日志分析服務(wù)器
                        //系統(tǒng)配置向?qū)罴?log-analyze-server
                        System.out.println("*********進(jìn)入日志分析服務(wù)器控制臺配置向?qū)?********");
                        String[] strCmdLog = {
                                "python /opt/tools/skylar_cli/bin/skylar_cli.pyc",//天擎配置向?qū)?
                                "server-type", //服務(wù)器模式
                                "log-analyze-server", //管理服務(wù)器:提供管理功能及應(yīng)用功能
                                "cache-info " + redisIp + ":6379", //緩存服務(wù)器
                                "db-info " + pgIp + ":5432", //設(shè)置數(shù)據(jù)庫信息
                                "queue-info " + beanstalkdIp + ":11300", //設(shè)置隊(duì)列信息
                                "web-server-info " + webIp + ":8080", //設(shè)置管理服務(wù)器端口
                                "sfmg-db-info " + pgIp + ":5432", //設(shè)置軟件管家數(shù)據(jù)庫
                                "commit",//提交配置
                                "exit"
 
                        };
 
                        //順序執(zhí)行配置向?qū)?
                        for (String str : strCmdLog) {
                            synchronized (bw) {
                                bw.write(str.trim());
                                bw.newLine();
                                System.out.println("step: " + str);
                                bw.wait(1000);
                            }
                        }
                        //測試進(jìn)程是否還存活
                        System.out.println("pro3:" + pro.isAlive());
                        bw.flush();//緩存提交
                        System.out.println("緩存提交!");
                        System.out.println("日志分析服務(wù)器配置向?qū)гO(shè)置成功!");
                        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();//進(jìn)程等待
    }
 
    public static void main(String[] args) throws Exception {
 
        TestMain testMain = new TestMain();
 
        /*
        //測試用
        String[] machines ={
                "role:web-server",
                "webIp:xx.xx.xx.110",
                "redisIp:xx.xx.xx.211",
                "beanstalkdIp:xx.xx.xx.211",
                "pgIp:xx.xx.xx.212"
        };*/
 
        testMain.cmdRun(args);
       /* System.exit(0);
        System.out.println("System.exit(0);");*/
    }
}

特別注意:

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

一定要使用 docker exec -i main bash ,不要使用 -it ,否則會報(bào)錯 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包,執(zhí)行jar包:

終于看到久違的部署成功界面~

到此這篇關(guān)于java實(shí)現(xiàn)Linux(centos) 中docker容器下命令交互(配置向?qū)В┑奈恼戮徒榻B到這了,更多相關(guān)docker容器命令交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 什么是Maven及如何配置國內(nèi)源實(shí)現(xiàn)自動獲取jar包的操作

    什么是Maven及如何配置國內(nèi)源實(shí)現(xiàn)自動獲取jar包的操作

    本文介紹了Maven的基本概念,包括項(xiàng)目構(gòu)建、依賴管理、倉庫管理以及如何設(shè)置國內(nèi)源,通過Maven,開發(fā)者可以自動化管理項(xiàng)目的依賴和構(gòu)建流程,提高開發(fā)效率,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解

    這篇文章主要為大家介紹了JUC循環(huán)屏障CyclicBarrier與CountDownLatch區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java中構(gòu)造、生成XML簡明教程

    Java中構(gòu)造、生成XML簡明教程

    這篇文章主要介紹了Java中構(gòu)造、生成XML簡明教程,本文通過dom4j包來完成,需要的朋友可以參考下
    2014-08-08
  • Java中輸入被跳過情況的深入探究

    Java中輸入被跳過情況的深入探究

    這篇文章主要給大家介紹了關(guān)于Java中輸入被跳過情況的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java判斷字符串是否為null的四種方式匯總

    java判斷字符串是否為null的四種方式匯總

    這篇文章主要介紹了java判斷字符串是否為null的四種方式匯總,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 一篇文章搞定Struts2的類型轉(zhuǎn)換

    一篇文章搞定Struts2的類型轉(zhuǎn)換

    這篇文章主要介紹了關(guān)于Struts2類型轉(zhuǎn)換的相關(guān)資料,文中主要介紹了Struts2的類型轉(zhuǎn)換器和自定義類型轉(zhuǎn)換器的實(shí)現(xiàn),有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • springcloud整合到項(xiàng)目中無法啟動報(bào)錯Failed to start bean 'eurekaAutoServiceRegistration'

    springcloud整合到項(xiàng)目中無法啟動報(bào)錯Failed to start bean&n

    這篇文章主要介紹了springcloud整合到項(xiàng)目中無法啟動報(bào)錯Failed to start bean 'eurekaAutoServiceRegistration'問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出)

    基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出)

    這篇文章主要介紹了基于ThreadLocal 的用法及內(nèi)存泄露(內(nèi)存溢出),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java?spring?validation?自動、手動校驗(yàn)

    java?spring?validation?自動、手動校驗(yàn)

    HibernateValidator簡化了Java開發(fā)中的參數(shù)校驗(yàn)過程,提供自動和手動兩種校驗(yàn)方式,通過引入相關(guān)依賴并使用@Validated注解,可以實(shí)現(xiàn)自動校驗(yàn),手動校驗(yàn)則需要使用ValidatorUtils類,此方法有效減少代碼重復(fù),提高開發(fā)效率
    2024-09-09
  • java網(wǎng)上商城項(xiàng)目第1篇之用戶注冊模塊

    java網(wǎng)上商城項(xiàng)目第1篇之用戶注冊模塊

    這篇文章主要為大家詳細(xì)介紹了java網(wǎng)上商城項(xiàng)目第1篇之用戶注冊模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評論

洛川县| 上犹县| 乐安县| 镇雄县| 名山县| 神池县| 邵武市| 海丰县| 台中县| 宁明县| 健康| 宿州市| 新疆| 新干县| 建昌县| 安远县| 阜南县| 湘乡市| 时尚| 托克逊县| 尉氏县| 额尔古纳市| 曲沃县| 太仓市| 达拉特旗| 土默特右旗| 阿拉善右旗| 黄平县| 楚雄市| 乐至县| 许昌市| 唐海县| 杂多县| 宁陵县| 土默特右旗| 孟连| 丰都县| 云霄县| 潮州市| 麦盖提县| 九江市|