Fabric8执行状态始终为1000



我想获得在Fabric8 Java Kubernetes客户端的容器中执行的命令的状态代码。

这是位于我的容器中的脚本:

echo Bye Bye
exit 1

当我使用CLI或NodeJS客户端运行脚本时,我能够获得输出状态代码

以下是一个来自fabric8存储库的示例:

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 InterruptedException {

String podName = "my-pod";
String namespace = "my-namespace";
try (
KubernetesClient client = new DefaultKubernetesClient();
ExecWatch watch = newExecWatch(client, namespace, podName)) {
Thread.sleep(10 * 1000L);
}
}
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("The shell will remain open for 10 seconds.");
}
@Override
public void onFailure(Throwable t, Response response) {
System.err.println("shell barfed");
}
@Override
public void onClose(int code, String reason) {
System.out.println("The shell will now close.");
}
}
}

然而,当查看输出时,似乎一切都很顺利。有办法获得输出状态代码吗?

可以使用wri方法:

可以使用.writingErrorChannel并解析响应:

{
"metadata": {},
"status": "Failure",
"message": "command terminated with non-zero exit code: exit status 1",
"reason": "NonZeroExitCode",
"details": {
"causes": [
{
"reason": "ExitCode",
"message": "1"
}
]
}
}

类型为:io.fabric8.kubernetes.api.model.Status

自从Fabric8 Kubernetes Client的6.x版本以来,ExecWatch接口中添加了一个新的exitCode()方法,该方法返回一个CompletableFuture<Integer>,因此现在您应该能够获得这样的退出代码:

ExecWatch execWatch = client.pods().inNamespace("default").withName("example-pod")
.writingOutput(System.out)
.writingError(System.out)
.exec("/bin/ping", "goo");
// ...
int exitCode = execWatch.exitCode().get();

最新更新