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