我想获得在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();