| | |
| | | * 根据前缀清理容器 |
| | | */ |
| | | 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())); |
| | | |
| | |
| | | |
| | | // 强制删除容器 |
| | | String rmCommand = "docker rm -f " + containerName; |
| | | log.info("执行命令: {}", rmCommand); |
| | | |
| | | Process rmProc = Runtime.getRuntime().exec(rmCommand); |
| | | rmProc.waitFor(10, TimeUnit.SECONDS); |
| | | |
| | |
| | | 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())); |
| | | |
| | |
| | | |
| | | // 强制删除容器 |
| | | String rmCommand = "docker rm -f " + containerName; |
| | | log.info("执行命令: {}", rmCommand); |
| | | Process rmProc = Runtime.getRuntime().exec(rmCommand); |
| | | rmProc.waitFor(10, TimeUnit.SECONDS); |
| | | |
| | |
| | | stoppedProc.waitFor(10, TimeUnit.SECONDS); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("根据镜像清理容器失败", e); |
| | | log.error("根据{}清理容器失败", filterDesc, e); |
| | | } |
| | | } |
| | | |