package com.geostar.gfstack.opinion.util; import java.io.BufferedReader; import java.io.Closeable; import java.io.File; import java.io.InputStreamReader; /** * @author 王睿 <wangrui1066@geostar.com.cn> * @date 2019/5/17 9:40 */ public class DockerSockUtils { private static final String DOCKER_SOCK_CMD_PREFIX = "curl -s --unix-socket /var/run/docker.sock http://localhost/"; public static void main(String[] args) { System.out.println(execDockerSockCmd("containers/json")); } /** * 經過docker套接字發送HTTP請求獲取數據 * * @param cmd * @return */ public static String execDockerSockCmd(String cmd) { return execCmd(DOCKER_SOCK_CMD_PREFIX + cmd); } /** * 執行系統命令, 返回執行結果 * * @param cmd 須要執行的命令 * @return */ public static String execCmd(String cmd) { return execCmd(cmd, null); } /** * 執行系統命令, 返回執行結果 * * @param cmd 須要執行的命令 * @param dir 執行命令的子進程的工做目錄, null 表示和當前主進程工做目錄相同 */ public static String execCmd(String cmd, File dir) { StringBuilder result = new StringBuilder(); Process process = null; BufferedReader bufrIn = null; BufferedReader bufrError = null; try { String[] command = {"/bin/sh", "-c", cmd}; // 執行命令, 返回一個子進程對象(命令在子進程中執行) process = Runtime.getRuntime().exec(command, null, dir); // 方法阻塞, 等待命令執行完成(成功會返回0) process.waitFor(); // 獲取命令執行結果, 有兩個結果: 正常的輸出 和 錯誤的輸出(PS: 子進程的輸出就是主進程的輸入) bufrIn = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); bufrError = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8")); // 讀取輸出 String line; while ((line = bufrIn.readLine()) != null) { result.append(line).append('\n'); } while ((line = bufrError.readLine()) != null) { result.append(line).append('\n'); } } catch (Exception e) { e.printStackTrace(); } finally { closeStream(bufrIn); closeStream(bufrError); // 銷燬子進程 if (process != null) { process.destroy(); } // 返回執行結果 return result.toString(); } } /** * 關閉流 * * @param stream */ private static void closeStream(Closeable stream) { if (stream != null) { try { stream.close(); } catch (Exception e) { e.printStackTrace(); } } } }