From 6cd5fefaf5f5f87572765b7d32cfa644541275cd Mon Sep 17 00:00:00 2001 From: wzp <2040239371@qq.com> Date: 星期三, 16 七月 2025 11:36:50 +0800 Subject: [PATCH] fix:修复docker不能正常清理的问题。设置60s超时时间 --- src/main/java/com/ots/project/tool/PdfDockerUtil.java | 204 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 189 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/ots/project/tool/PdfDockerUtil.java b/src/main/java/com/ots/project/tool/PdfDockerUtil.java index 97a1b2c..bb7fa72 100644 --- a/src/main/java/com/ots/project/tool/PdfDockerUtil.java +++ b/src/main/java/com/ots/project/tool/PdfDockerUtil.java @@ -36,7 +36,7 @@ /** * 浠诲姟瓒呮椂鏃堕棿锛堢锛� */ - private static final int TASK_TIMEOUT_SECONDS = 300; // 5鍒嗛挓 + private static final int TASK_TIMEOUT_SECONDS = 60; // 1鍒嗛挓 /** * 绉佹湁鏋勯�犲嚱鏁帮紝闃叉澶栭儴瀹炰緥鍖� @@ -82,11 +82,11 @@ // 2. 鐢熸垚鍞竴瀹瑰櫒鍚嶇О String containerName = CONTAINER_NAME_PREFIX + System.currentTimeMillis(); - // 3. 娓呯悊鏃у鍣� + // 3. 杞婚噺绾ф竻鐞嗘棫瀹瑰櫒锛堝彲閫夛紝濡傛灉涓嶉渶瑕佸彲浠ユ敞閲婃帀锛� cleanupOldContainers(); - // 4. 鏋勫缓Docker鍛戒护 - String command = MessageFormat.format(docx2pdfPath, profile, fileName); + // 4. 鏋勫缓Docker鍛戒护锛堢‘淇濆寘鍚鍣ㄥ悕绉帮級 + String command = buildDockerCommand(docx2pdfPath, profile, fileName, containerName); log.info("docker鎵ц鍛戒护:{}", command); // 5. 鎵цDocker鍛戒护锛堝甫瓒呮椂锛� @@ -130,6 +130,40 @@ } /** + * 鏋勫缓Docker鍛戒护锛岀‘淇濆寘鍚鍣ㄥ悕绉� + * @param docx2pdfPath docker鍛戒护妯℃澘璺緞 + * @param profile 閰嶇疆鏂囦欢璺緞 + * @param fileName 鏂囦欢鍚� + * @param containerName 瀹瑰櫒鍚嶇О + * @return 瀹屾暣鐨凞ocker鍛戒护 + */ + private String buildDockerCommand(String docx2pdfPath, String profile, String fileName, String containerName) { + // 濡傛灉鍛戒护妯℃澘涓凡缁忓寘鍚� --name 鍙傛暟锛屽垯鐩存帴浣跨敤 + if (docx2pdfPath.contains("--name")) { + return MessageFormat.format(docx2pdfPath, profile, fileName); + } + + // 濡傛灉鍛戒护妯℃澘涓病鏈� --name 鍙傛暟锛屽垯娣诲姞瀹瑰櫒鍚嶇О + // 鍋囪鍛戒护妯℃澘鏍煎紡涓�: docker run [鍏朵粬鍙傛暟] image_name + // 鎴戜滑闇�瑕佸湪 docker run 鍚庢坊鍔� --name 鍙傛暟 + + String baseCommand = MessageFormat.format(docx2pdfPath, profile, fileName); + + // 妫�鏌ユ槸鍚﹀寘鍚� docker run + if (baseCommand.contains("docker run")) { + // 鍦� docker run 鍚庢彃鍏� --name 鍙傛暟 + String[] parts = baseCommand.split("docker run", 2); + if (parts.length == 2) { + return "docker run --name " + containerName + parts[1]; + } + } + + // 濡傛灉鏃犳硶瑙f瀽锛屽垯鐩存帴杩斿洖鍘熷懡浠� + log.warn("鏃犳硶瑙f瀽Docker鍛戒护妯℃澘锛屼娇鐢ㄥ師濮嬪懡浠�: {}", baseCommand); + return baseCommand; + } + + /** * 鑾峰彇鏂囦欢閿� */ private FileLock acquireFileLock() { @@ -169,33 +203,35 @@ } /** - * 娓呯悊鏃у鍣� + * 娓呯悊鏃у鍣紙杞婚噺绾х増鏈級 */ private void cleanupOldContainers() { try { - // 鏌ユ壘骞跺仠姝㈡墍鏈夌浉鍏冲鍣� - String findCommand = "docker ps -a --filter name=" + CONTAINER_NAME_PREFIX + "* --format '{{.Names}}'"; + // 鍙竻鐞嗗仠姝㈢姸鎬佺殑瀹瑰櫒锛屼笉骞叉壈杩愯涓殑瀹瑰櫒 + String findCommand = "docker ps -a --filter name=" + CONTAINER_NAME_PREFIX + "* --filter status=exited --format '{{.Names}}'"; Process findProc = Runtime.getRuntime().exec(findCommand); BufferedReader reader = new BufferedReader(new InputStreamReader(findProc.getInputStream())); String containerName; + boolean hasCleaned = false; while ((containerName = reader.readLine()) != null) { if (!containerName.trim().isEmpty()) { - log.info("娓呯悊鏃у鍣�: {}", containerName); + log.info("娓呯悊宸插仠姝㈢殑鏃у鍣�: {}", containerName); - // 鍋滄瀹瑰櫒 - String stopCommand = "docker stop " + containerName; - Runtime.getRuntime().exec(stopCommand); - - // 鍒犻櫎瀹瑰櫒 + // 鍒犻櫎宸插仠姝㈢殑瀹瑰櫒 String rmCommand = "docker rm " + containerName; Runtime.getRuntime().exec(rmCommand); + hasCleaned = true; } } reader.close(); - findProc.waitFor(10, TimeUnit.SECONDS); + findProc.waitFor(5, TimeUnit.SECONDS); + + if (!hasCleaned) { + log.debug("娌℃湁鍙戠幇闇�瑕佹竻鐞嗙殑鏃у鍣�"); + } } catch (Exception e) { log.warn("娓呯悊鏃у鍣ㄦ椂鍑虹幇寮傚父", e); @@ -203,7 +239,7 @@ } /** - * 寮哄埗缁堟杩涚▼ + * 寮哄埗缁堟杩涚▼骞堕攢姣佺浉鍏冲鍣� */ private void forceKillProcess(Process proc) { try { @@ -216,12 +252,150 @@ log.warn("寮哄埗缁堟杩涚▼"); } } + + // 寮哄埗娓呯悊鎵�鏈夌浉鍏冲鍣� + forceCleanupContainers(); + } catch (Exception e) { log.error("寮哄埗缁堟杩涚▼澶辫触", e); } } /** + * 寮哄埗娓呯悊鎵�鏈夌浉鍏冲鍣� + */ + private void forceCleanupContainers() { + try { + log.info("寮�濮嬪己鍒舵竻鐞嗙浉鍏冲鍣�..."); + + // 娓呯悊甯︽湁鐗瑰畾鍓嶇紑鐨勫鍣� + cleanupContainersByPrefix(); + + // 娓呯悊鍙兘娈嬬暀鐨刪eadless-wps瀹瑰櫒锛堝熀浜庨暅鍍忓悕绉帮級 + cleanupContainersByImage("headless-wps-example"); + + log.info("瀹瑰櫒寮哄埗娓呯悊瀹屾垚"); + + } catch (Exception e) { + log.error("寮哄埗娓呯悊瀹瑰櫒澶辫触", e); + } + } + + /** + * 鏍规嵁鍓嶇紑娓呯悊瀹瑰櫒 + */ + private void cleanupContainersByPrefix() { + try { + // 鏌ユ壘鎵�鏈夎繍琛屼腑鐨勭浉鍏冲鍣� + String runningCommand = "docker ps --filter name=" + CONTAINER_NAME_PREFIX + "* --format '{{.Names}}'"; + Process runningProc = Runtime.getRuntime().exec(runningCommand); + BufferedReader runningReader = new BufferedReader(new InputStreamReader(runningProc.getInputStream())); + + String containerName; + while ((containerName = runningReader.readLine()) != null) { + if (!containerName.trim().isEmpty()) { + log.warn("寮哄埗鍋滄杩愯涓殑瀹瑰櫒: {}", containerName); + + // 寮哄埗鍋滄瀹瑰櫒 + String killCommand = "docker kill " + containerName; + Process killProc = Runtime.getRuntime().exec(killCommand); + killProc.waitFor(10, TimeUnit.SECONDS); + + // 寮哄埗鍒犻櫎瀹瑰櫒 + String rmCommand = "docker rm -f " + containerName; + Process rmProc = Runtime.getRuntime().exec(rmCommand); + rmProc.waitFor(10, TimeUnit.SECONDS); + + log.info("宸插己鍒舵竻鐞嗗鍣�: {}", containerName); + } + } + runningReader.close(); + runningProc.waitFor(10, TimeUnit.SECONDS); + + // 鏌ユ壘鎵�鏈夊仠姝㈢殑鐩稿叧瀹瑰櫒骞跺垹闄� + String stoppedCommand = "docker ps -a --filter name=" + CONTAINER_NAME_PREFIX + "* --format '{{.Names}}'"; + Process stoppedProc = Runtime.getRuntime().exec(stoppedCommand); + BufferedReader stoppedReader = new BufferedReader(new InputStreamReader(stoppedProc.getInputStream())); + + while ((containerName = stoppedReader.readLine()) != null) { + if (!containerName.trim().isEmpty()) { + log.warn("寮哄埗鍒犻櫎鍋滄鐨勫鍣�: {}", containerName); + + // 寮哄埗鍒犻櫎瀹瑰櫒 + String rmCommand = "docker rm -f " + containerName; + Process rmProc = Runtime.getRuntime().exec(rmCommand); + rmProc.waitFor(10, TimeUnit.SECONDS); + + log.info("宸插己鍒跺垹闄ゅ鍣�: {}", containerName); + } + } + stoppedReader.close(); + stoppedProc.waitFor(10, TimeUnit.SECONDS); + + } catch (Exception e) { + log.error("鏍规嵁鍓嶇紑娓呯悊瀹瑰櫒澶辫触", e); + } + } + + /** + * 鏍规嵁闀滃儚鍚嶇О娓呯悊瀹瑰櫒 + */ + private void cleanupContainersByImage(String imageName) { + try { + log.info("娓呯悊闀滃儚涓� {} 鐨勫鍣�", imageName); + + // 鏌ユ壘鎵�鏈夎繍琛屼腑鐨勭浉鍏冲鍣� + String runningCommand = "docker ps --filter ancestor=" + imageName + " --format '{{.Names}}'"; + Process runningProc = Runtime.getRuntime().exec(runningCommand); + BufferedReader runningReader = new BufferedReader(new InputStreamReader(runningProc.getInputStream())); + + String containerName; + while ((containerName = runningReader.readLine()) != null) { + if (!containerName.trim().isEmpty()) { + log.warn("寮哄埗鍋滄杩愯涓殑瀹瑰櫒: {}", containerName); + + // 寮哄埗鍋滄瀹瑰櫒 + String killCommand = "docker kill " + containerName; + Process killProc = Runtime.getRuntime().exec(killCommand); + killProc.waitFor(10, TimeUnit.SECONDS); + + // 寮哄埗鍒犻櫎瀹瑰櫒 + String rmCommand = "docker rm -f " + containerName; + Process rmProc = Runtime.getRuntime().exec(rmCommand); + rmProc.waitFor(10, TimeUnit.SECONDS); + + log.info("宸插己鍒舵竻鐞嗗鍣�: {}", containerName); + } + } + runningReader.close(); + runningProc.waitFor(10, TimeUnit.SECONDS); + + // 鏌ユ壘鎵�鏈夊仠姝㈢殑鐩稿叧瀹瑰櫒骞跺垹闄� + String stoppedCommand = "docker ps -a --filter ancestor=" + imageName + " --format '{{.Names}}'"; + Process stoppedProc = Runtime.getRuntime().exec(stoppedCommand); + BufferedReader stoppedReader = new BufferedReader(new InputStreamReader(stoppedProc.getInputStream())); + + while ((containerName = stoppedReader.readLine()) != null) { + if (!containerName.trim().isEmpty()) { + log.warn("寮哄埗鍒犻櫎鍋滄鐨勫鍣�: {}", containerName); + + // 寮哄埗鍒犻櫎瀹瑰櫒 + String rmCommand = "docker rm -f " + containerName; + Process rmProc = Runtime.getRuntime().exec(rmCommand); + rmProc.waitFor(10, TimeUnit.SECONDS); + + log.info("宸插己鍒跺垹闄ゅ鍣�: {}", containerName); + } + } + stoppedReader.close(); + stoppedProc.waitFor(10, TimeUnit.SECONDS); + + } catch (Exception e) { + log.error("鏍规嵁闀滃儚娓呯悊瀹瑰櫒澶辫触", e); + } + } + + /** * 娓呯悊璧勬簮 */ private void cleanupResources(Process proc, FileLock lock) { -- Gitblit v1.9.1