You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fabric8执行容器命令状态码始终为1000 如何获取命令真实退出码

解决Fabric8 Java Kubernetes客户端获取容器命令退出码异常问题

问题根因

你当前在onClose回调中拿到的code是WebSocket连接的关闭码,1000是WebSocket正常关闭的标准编码,和容器内命令的真实退出码没有关联。另外你开启的.withTTY()配置会导致Kubernetes不返回命令的退出状态,是触发问题的核心原因之一。

修复步骤

  • 移除exec配置中的.withTTY()项:TTY模式下Kubernetes不会传递进程退出状态码
  • 使用Fabric8 ExecWatch自带的exitCode()方法获取命令退出码:该方法返回CompletableFuture<Integer>,会在命令执行完成后异步返回真实状态码
  • 替换原有硬编码等待10秒的逻辑,改为等待退出码Future完成,逻辑更准确高效

修复后代码示例

package org.package;

import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.dsl.ExecListener;
import io.fabric8.kubernetes.client.dsl.ExecWatch;
import okhttp3.Response;

public class OtherMain {

  public static void main(String[] args) throws Exception {
    String podName = "my-pod";
    String namespace = "my-namespace";

    try (
        KubernetesClient client = new DefaultKubernetesClient();
        ExecWatch watch = newExecWatch(client, namespace, podName)) {
      // 等待命令执行完成,获取真实退出码
      Integer exitCode = watch.exitCode().get();
      System.out.println("容器内命令执行退出码:" + exitCode);
    }
  }

  private static ExecWatch newExecWatch(KubernetesClient client, String namespace, String podName) {
    return client.pods()
        .inNamespace(namespace)
        .withName(podName)
        .readingInput(System.in)
        .writingOutput(System.out)
        .writingError(System.err)
        // 已移除withTTY配置
        .usingListener(new SimpleListener())
        .exec("sh", "test.sh");
  }

  private static class SimpleListener implements ExecListener {
    @Override
    public void onOpen(Response response) {
      System.out.println("命令执行连接已建立");
    }

    @Override
    public void onFailure(Throwable t, Response response) {
      System.err.println("命令执行连接异常");
    }

    @Override
    public void onClose(int code, String reason) {
      System.out.println("命令执行连接已关闭,WebSocket关闭码:" + code);
    }
  }
}

验证说明

使用你给出的测试脚本exit 1,修改后运行代码会输出容器内命令执行退出码:1,和CLI、NodeJS客户端返回结果完全一致。

内容的提问来源于stack exchange,提问作者Geoffrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:15:03