From 9971adc1125b580378763d4acf6bd1f4ef9043d4 Mon Sep 17 00:00:00 2001 From: ThugPigeon653 <89567974+ThugPigeon653@users.noreply.github.com> Date: Sun, 17 Sep 2023 12:58:28 +1000 Subject: [PATCH 1/2] Fixed Absolute path, and container not stopping issues --- .../docker/workflow/WithContainerStep.java | 2 +- .../docker/workflow/client/DockerClient.java | 11 ++++++++--- .../workflow/client/WindowsDockerClient.java | 18 +++++++++++++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java b/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java index f9814d124..988963a5f 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java @@ -196,7 +196,7 @@ public Execution() { volumes.put(tmp, tmp); } - String command = launcher.isUnix() ? "cat" : "cmd.exe"; + String command = "cat"; container = dockerClient.run(env, step.image, step.args, ws, volumes, volumesFromContainers, envReduced, dockerClient.whoAmI(), /* expected to hang until killed */ command); final List ps = dockerClient.listProcess(env, container); if (!ps.contains(command)) { diff --git a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java index b36b6fd91..a03169f8d 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java @@ -182,10 +182,15 @@ public List listProcess(@NonNull EnvVars launchEnv, @NonNull String cont * @param containerId The container ID. */ public void stop(@NonNull EnvVars launchEnv, @NonNull String containerId) throws IOException, InterruptedException { - LaunchResult result = launch(launchEnv, false, "stop", "--time=1", containerId); - if (result.getStatus() != 0) { - throw new IOException(String.format("Failed to kill container '%s'.", containerId)); + stop(launchEnv, containerId, 1); + } + public void stop(@NonNull EnvVars launchEnv, @NonNull String containerId, @NonNull int stopTime) throws IOException, InterruptedException { + LaunchResult result = launch(launchEnv, false, "docker", "stop", String.format("--time=%s", stopTime), containerId); + Thread.sleep((long)stopTime*1100); + if(inspect(launchEnv, containerId, ".Name")==null){ + throw new IOException(String.format("Container '%s' failed to kill.", containerId)); } + if (!SKIP_RM_ON_STOP) { rm(launchEnv, containerId); } diff --git a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/WindowsDockerClient.java b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/WindowsDockerClient.java index 7c7a0f9a5..ca0350ae1 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/WindowsDockerClient.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/WindowsDockerClient.java @@ -29,6 +29,14 @@ public WindowsDockerClient(@NonNull Launcher launcher, @CheckForNull Node node, this.node = node; } + private String getDockerFormattedPath(@NonNull String path){ + path=path.replaceAll(":", ""); + if(!path.startsWith("/")&&path.contains("/")){ + path="/"+path; + } + return path; + } + @Override public String run(@NonNull EnvVars launchEnv, @NonNull String image, @CheckForNull String args, @CheckForNull String workdir, @NonNull Map volumes, @NonNull Collection volumesFromContainers, @NonNull EnvVars containerEnv, @NonNull String user, @NonNull String... command) throws IOException, InterruptedException { ArgumentListBuilder argb = new ArgumentListBuilder("docker", "run", "-d", "-t"); @@ -37,10 +45,10 @@ public String run(@NonNull EnvVars launchEnv, @NonNull String image, @CheckForNu } if (workdir != null) { - argb.add("-w", workdir); + argb.add("-w", getDockerFormattedPath(workdir)); } for (Map.Entry volume : volumes.entrySet()) { - argb.add("-v", volume.getKey() + ":" + volume.getValue()); + argb.add("-v", getDockerFormattedPath(volume.getKey()) + ":" + getDockerFormattedPath(volume.getValue())); } for (String containerId : volumesFromContainers) { argb.add("--volumes-from", containerId); @@ -113,7 +121,11 @@ public String whoAmI() throws IOException, InterruptedException { } private LaunchResult launch(EnvVars env, boolean quiet, FilePath workDir, String... args) throws IOException, InterruptedException { - return launch(env, quiet, workDir, new ArgumentListBuilder(args)); + String[] newArgs = new String[args.length]; + for (int i = 0; i < args.length; i++) { + newArgs[i]=getDockerFormattedPath(args[i]); + } + return launch(env, quiet, workDir, new ArgumentListBuilder(newArgs)); } private LaunchResult launch(EnvVars env, boolean quiet, FilePath workDir, ArgumentListBuilder argb) throws IOException, InterruptedException { if (LOGGER.isLoggable(Level.FINE)) { From b2a6c3ce660549c9de2a929fe496b98fd1e06d6c Mon Sep 17 00:00:00 2001 From: ThugPigeon653 <89567974+ThugPigeon653@users.noreply.github.com> Date: Sun, 17 Sep 2023 13:47:33 +1000 Subject: [PATCH 2/2] Removed un-used variable assignment --- .../jenkinsci/plugins/docker/workflow/client/DockerClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java index a03169f8d..1d3c53024 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/client/DockerClient.java @@ -185,7 +185,7 @@ public void stop(@NonNull EnvVars launchEnv, @NonNull String containerId) throws stop(launchEnv, containerId, 1); } public void stop(@NonNull EnvVars launchEnv, @NonNull String containerId, @NonNull int stopTime) throws IOException, InterruptedException { - LaunchResult result = launch(launchEnv, false, "docker", "stop", String.format("--time=%s", stopTime), containerId); + launch(launchEnv, false, "docker", "stop", String.format("--time=%s", stopTime), containerId); Thread.sleep((long)stopTime*1100); if(inspect(launchEnv, containerId, ".Name")==null){ throw new IOException(String.format("Container '%s' failed to kill.", containerId));