Java com.spotify.docker.client.DockerRequestException:请求错误:删除unix://localhost:80/v1.12/containers/...: 409
我正在开发一个Java应用程序,它使用GoogleKubernetes在ApacheTomcatDocker容器中部署web构件。我使用此工具是为了执行Docker图像和集装箱搬运活动以及Kubernetes相关功能 在这个应用程序中,我添加了一个功能,使用户能够删除用户部署的web工件 当我离开时Java com.spotify.docker.client.DockerRequestException:请求错误:删除unix://localhost:80/v1.12/containers/...: 409,java,docker,spotify,kubernetes,fabric8,Java,Docker,Spotify,Kubernetes,Fabric8,我正在开发一个Java应用程序,它使用GoogleKubernetes在ApacheTomcatDocker容器中部署web构件。我使用此工具是为了执行Docker图像和集装箱搬运活动以及Kubernetes相关功能 在这个应用程序中,我添加了一个功能,使用户能够删除用户部署的web工件 当我离开时 删除我用来生成所需数量pod副本的Kubernetes复制控制器 单独删除副本POD(因为当通过Java API中的相应方法删除复制控制器时,不会自动删除POD) 删除创建的相应服务 删除与已删除P
public boolean remove(String tenant, String appName) throws WebArtifactHandlerException {
String componentName = generateKubernetesComponentName(tenant, appName);
final int singleImageIndex = 0;
try {
if (replicationControllerHandler.getReplicationController(componentName) != null) {
String dockerImage = replicationControllerHandler.getReplicationController(componentName).getSpec()
.getTemplate().getSpec().getContainers().get(singleImageIndex).getImage();
List<String> containerIds = containerHandler.getRunningContainerIdsByImage(dockerImage);
replicationControllerHandler.deleteReplicationController(componentName);
podHandler.deleteReplicaPods(tenant, appName);
serviceHandler.deleteService(componentName);
Thread.sleep(OPERATION_DELAY_IN_MILLISECONDS);
containerHandler.deleteContainers(containerIds);
imageBuilder.removeImage(tenant, appName, getDockerImageVersion(dockerImage));
return true;
} else {
return false;
}
} catch (Exception exception) {
String message = String.format("Failed to remove web artifact[artifact]: %s",
generateKubernetesComponentName(tenant, appName));
LOG.error(message, exception);
throw new WebArtifactHandlerException(message, exception);
}
}
我搜索了大量的源代码以获取相关帮助,但仍然无法在所有情况下避免,我执行了此功能
一开始,我比现在更容易遇到这个问题,但是在删除每个Docker容器的末尾和删除任何Docker容器之前,允许执行线程休眠,逐渐减少了我遇到这个问题的实例数
休眠线程是这个问题的最终解决方案吗?还是有其他原因导致这个问题突然出现,并且有一个解决方案可以帮助我避免这个异常?非常感谢您的帮助 不幸的是,我不熟悉Java客户端库 我的建议是尝试使用常规命令行客户端(kubectl)。如果这样做有效,那么您就知道问题出在Java客户机库或您对它的使用上。如果使用命令行客户机不起作用,那么会有更多的人可以帮助您(因为熟悉命令行客户机的人要比熟悉Java客户机库的人多得多) 换句话说 %kubectl删除豆荚…#--默认情况下,cascade=true %kubectl删除服务 我很好奇为什么需要第(4)步和第(5)步。删除pod时,步骤(4)应自动发生,步骤(5)应在后台自动发生
如果这两行“kubectl delete”有效,那么问题在于Java客户机库或您对它的使用。首先,我建议从Java代码中删除对deleteContainers()和removeImage()的调用,看看这是否有帮助。我认为这些步骤是不必要的。是的,大卫,就是这样。这些步骤在命令行客户机(kubectl)上运行良好。删除pod时无法删除相应的容器是由于Java客户机库而出现的问题。删除复制控制器时也是这种情况,其中关联的POD不会被删除。这就是我手动删除它们的原因。另外,如果没有deleteContainers()和removeImage()方法,代码确实可以很好地工作,但我将它们包括在内,因为提供给我的规范要求我这样做。此外,我没有使用命令行客户机(kubectl),因为我被要求使用Java程序代码执行这些任务。当然,我理解您为什么要使用Java客户端库;我只是建议尝试使用命令行客户端来帮助您缩小问题的范围;我只是建议尝试使用命令行客户端来帮助您缩小问题范围。无论如何,仔细查看您收到的错误消息,可能是因为在运行deleteContainers()时容器已被删除。我建议您在收到该错误消息时,检查容器是否已被删除。我想你会发现它们已经被删除了。如果您发现它们尚未被删除,请告诉我,我们可以寻找另一个原因。您好,DavidO,是的,我尝试了您问我的方式,但当Docker ps-a应用时,异常指定的Docker容器仍然可以被视为停止的容器,但异常仍然发生。我现在感觉这是否与我的机器的性能有关,因为在本次会话中(在我启动操作系统后),我尝试了大约4次删除操作,效果很好,但在第5次尝试中,我再次出现上述错误。
public void deleteContainers(List<String> containerIds) throws WebArtifactHandlerException {
try {
for (String containerId : containerIds) {
dockerClient.removeContainer(containerId);
Thread.sleep(OPERATION_DELAY_IN_MILLISECONDS);
}
} catch (Exception exception) {
String message = "Could not delete the Docker Containers.";
LOG.error(message, exception);
throw new WebArtifactHandlerException(message, exception);
}
}
Sep 11, 2015 3:57:28 PM org.apache.poc.webartifact.WebArtifactHandler remove
SEVERE: Failed to remove web artifact[artifact]: app-wso2-com
org.apache.poc.miscellaneous.exceptions.WebArtifactHandlerException: Could not delete the Docker Containers.
at org.apache.poc.docker.JavaWebArtifactContainerHandler.deleteContainers(JavaWebArtifactContainerHandler.java:80)
at org.apache.poc.webartifact.WebArtifactHandler.remove(WebArtifactHandler.java:206)
at org.apache.poc.Executor.process(Executor.java:222)
at org.apache.poc.Executor.main(Executor.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: com.spotify.docker.client.DockerRequestException: Request error: DELETE unix://localhost:80/v1.12/containers/af05916d2bddf73dcf8bf41c6ea7f5f3b859c90b97447a8248ffa7b5b3968691: 409
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1061)
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1021)
at com.spotify.docker.client.DefaultDockerClient.removeContainer(DefaultDockerClient.java:544)
at com.spotify.docker.client.DefaultDockerClient.removeContainer(DefaultDockerClient.java:535)
at org.wso2.carbon6.poc.docker.JavaWebArtifactContainerHandler.deleteContainers(JavaWebArtifactContainerHandler.java:74)
... 8 more
Caused by: com.spotify.docker.client.shaded.javax.ws.rs.ClientErrorException: HTTP 409 Conflict
at org.glassfish.jersey.client.JerseyInvocation.createExceptionForFamily(JerseyInvocation.java:991)
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:975)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:795)
at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:91)
at org.glassfish.jersey.client.JerseyInvocation$5.completed(JerseyInvocation.java:756)
at org.glassfish.jersey.client.ClientRuntime.processResponse(ClientRuntime.java:189)
at org.glassfish.jersey.client.ClientRuntime.access$300(ClientRuntime.java:74)
at org.glassfish.jersey.client.ClientRuntime$1.run(ClientRuntime.java:171)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:320)
at org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java:201)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)