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
相关产品推荐
相关产品推荐

