[测评系统]--测评系统核心代码库
wzp
2025-07-18 b6a1cee9c6fbfe0a1f8f7c410c637248e29239e5
fix:修复docker不能正常清理的问题。设置60s超时时间
1个文件已修改
71 ■■■■ 已修改文件
src/main/java/com/ots/project/tool/PdfDockerUtil.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ots/project/tool/PdfDockerUtil.java
@@ -285,67 +285,27 @@
     * 根据前缀清理容器
     */
    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);
        }
        cleanupContainersByFilter("name=" + CONTAINER_NAME_PREFIX + "*", "前缀");
    }
    
    /**
     * 根据镜像名称清理容器
     */
    private void cleanupContainersByImage(String imageName) {
        cleanupContainersByFilter("ancestor=" + imageName, "镜像 " + imageName);
    }
    /**
     * 通用的容器清理方法
     * @param filter 过滤条件,如 name=prefix*" 或 "ancestor=imageName"
     * @param filterDesc 过滤条件描述,用于日志输出
     */
    private void cleanupContainersByFilter(String filter, String filterDesc) {
        try {
            log.info("清理镜像为 {} 的容器", imageName);
            log.info("清理{}容器", filterDesc);
            
            // 查找所有运行中的相关容器
            String runningCommand = "docker ps --filter ancestor=" + imageName + " --format '{{.Names}}'";
            String runningCommand = "docker ps --filter " + filter + " --format '{{.Names}}'";
            Process runningProc = Runtime.getRuntime().exec(runningCommand);
            BufferedReader runningReader = new BufferedReader(new InputStreamReader(runningProc.getInputStream()));
            
@@ -361,6 +321,8 @@
                    
                    // 强制删除容器
                    String rmCommand = "docker rm -f " + containerName;
                    log.info("执行命令: {}", rmCommand);
                    Process rmProc = Runtime.getRuntime().exec(rmCommand);
                    rmProc.waitFor(10, TimeUnit.SECONDS);
                    
@@ -371,7 +333,7 @@
            runningProc.waitFor(10, TimeUnit.SECONDS);
            
            // 查找所有停止的相关容器并删除
            String stoppedCommand = "docker ps -a --filter ancestor=" + imageName + " --format '{{.Names}}'";
            String stoppedCommand = "docker ps -a --filter " + filter + " --format '{{.Names}}'";
            Process stoppedProc = Runtime.getRuntime().exec(stoppedCommand);
            BufferedReader stoppedReader = new BufferedReader(new InputStreamReader(stoppedProc.getInputStream()));
            
@@ -381,6 +343,7 @@
                    
                    // 强制删除容器
                    String rmCommand = "docker rm -f " + containerName;
                    log.info("执行命令: {}", rmCommand);
                    Process rmProc = Runtime.getRuntime().exec(rmCommand);
                    rmProc.waitFor(10, TimeUnit.SECONDS);
                    
@@ -391,7 +354,7 @@
            stoppedProc.waitFor(10, TimeUnit.SECONDS);
            
        } catch (Exception e) {
            log.error("根据镜像清理容器失败", e);
            log.error("根据{}清理容器失败", filterDesc, e);
        }
    }