Java com.spotify.docker.client.DockerRequestException:请求错误:删除unix://localhost:80/v1.12/containers/...: 409

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

我正在开发一个Java应用程序,它使用GoogleKubernetes在ApacheTomcatDocker容器中部署web构件。我使用此工具是为了执行Docker图像和集装箱搬运活动以及Kubernetes相关功能

在这个应用程序中,我添加了一个功能,使用户能够删除用户部署的web工件

当我离开时

  • 删除我用来生成所需数量pod副本的Kubernetes复制控制器

  • 单独删除副本POD(因为当通过Java API中的相应方法删除复制控制器时,不会自动删除POD)

  • 删除创建的相应服务

  • 删除与已删除POD对应的Docker容器

  • 最后,删除用于部署的Docker映像

  • 以下代码显示了实现的删除功能:

    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)