diff --git a/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java b/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java index d59147e..46f7cfb 100644 --- a/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java +++ b/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java @@ -51,9 +51,14 @@ public class SystemUpdateService { // 解决方案:先用 docker run -d 启动一个独立助手容器,它不依附于 tenant-service, // 能在 tenant-service 停止后继续完成重建。 emit.accept(">>> 启动自更新助手容器..."); - String registry = System.getenv().getOrDefault("REGISTRY", ""); - String imageTag = System.getenv().getOrDefault("IMAGE_TAG", "latest"); - String selfImage = registry.isEmpty() ? "alpine" : (registry + "/tenant-service:" + imageTag); + // Resolve the image by inspecting the running container via compose labels, + // so we don't depend on REGISTRY/IMAGE_TAG being present in the container env. + String selfImage = getCurrentImage(); + if (selfImage == null) { + emit.accept(">>> [错误] 无法获取当前 tenant-service 镜像名,请检查容器标签或手动执行更新。"); + emit.accept("DONE"); + return; + } boolean helperStarted = spawnSelfUpdater(composeFile, selfImage); if (helperStarted) { @@ -100,19 +105,39 @@ public class SystemUpdateService { } } + // Use compose labels instead of container name — works with both Compose v1 (xuqm_svc_1) + // and Compose v2 (xuqm-svc-1) naming conventions. private boolean isRunning(String service) { - String containerName = "xuqm-" + service; try { - Process p = new ProcessBuilder("docker", "inspect", "--type=container", containerName) - .redirectErrorStream(true) - .start(); - p.getInputStream().transferTo(java.io.OutputStream.nullOutputStream()); - return p.waitFor() == 0; + Process p = new ProcessBuilder( + "docker", "ps", "-q", + "--filter", "label=com.docker.compose.project=xuqm", + "--filter", "label=com.docker.compose.service=" + service + ).redirectErrorStream(true).start(); + String out = new String(p.getInputStream().readAllBytes()).trim(); + p.waitFor(); + return !out.isEmpty(); } catch (Exception e) { return false; } } + private String getCurrentImage() { + try { + Process p = new ProcessBuilder( + "docker", "ps", + "--filter", "label=com.docker.compose.project=xuqm", + "--filter", "label=com.docker.compose.service=tenant-service", + "--format", "{{.Image}}" + ).redirectErrorStream(true).start(); + String out = new String(p.getInputStream().readAllBytes()).trim(); + p.waitFor(); + return out.isEmpty() ? null : out; + } catch (Exception e) { + return null; + } + } + private void exec(Consumer emit, String... cmd) { try { Process p = new ProcessBuilder(cmd)