From 72352f070c1140b36e3c6b785d701da82cfaa771 Mon Sep 17 00:00:00 2001 From: "alon.dotan" Date: Sun, 24 Jul 2022 22:18:39 +0300 Subject: [PATCH] configurable docker command via env vars --- .../plugins/docker/workflow/WithContainerStep.java | 4 ++-- .../plugins/docker/workflow/client/DockerClient.java | 4 ++++ .../jenkinsci/plugins/docker/workflow/DockerTestUtil.java | 7 ++++++- .../plugins/docker/workflow/client/DockerClientTest.java | 3 ++- 4 files changed, 14 insertions(+), 4 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 f81881114..24f89087a 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java @@ -196,10 +196,10 @@ public Execution() { volumes.put(tmp, tmp); } - String command = launcher.isUnix() ? "cat" : "cmd.exe"; + String[] command = launcher.isUnix() ? DockerClient.getUnixCommand(envHost, "cat") : "cmd.exe".split(" "); 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)) { + if (!ps.contains(Arrays.toString(command))) { listener.error( "The container started but didn't run the expected command. " + "Please double check your ENTRYPOINT does execute the command passed as docker run argument, " + 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 ce27ceaa4..672a1676d 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 @@ -90,6 +90,10 @@ public class DockerClient { private final @CheckForNull Node node; private final @CheckForNull String toolName; + public static String[] getUnixCommand(EnvVars env, String defaultCmd) { + return env.get("DEFAULT_DOCKER_COMMAND", defaultCmd).split(" "); + } + public DockerClient(@NonNull Launcher launcher, @CheckForNull Node node, @CheckForNull String toolName) { this.launcher = launcher; this.node = node; diff --git a/src/test/java/org/jenkinsci/plugins/docker/workflow/DockerTestUtil.java b/src/test/java/org/jenkinsci/plugins/docker/workflow/DockerTestUtil.java index 486a433d5..47347730c 100644 --- a/src/test/java/org/jenkinsci/plugins/docker/workflow/DockerTestUtil.java +++ b/src/test/java/org/jenkinsci/plugins/docker/workflow/DockerTestUtil.java @@ -84,6 +84,11 @@ public static EnvVars newDockerLaunchEnv() { return env; } + public static EnvVars newHostEnv() { + EnvVars env = new EnvVars(); + env.put("DEFAULT_DOCKER_COMMAND", "sh -c sleep INF"); + return env; + } + private DockerTestUtil() {} - } diff --git a/src/test/java/org/jenkinsci/plugins/docker/workflow/client/DockerClientTest.java b/src/test/java/org/jenkinsci/plugins/docker/workflow/client/DockerClientTest.java index 2351e8eef..85eb416b7 100644 --- a/src/test/java/org/jenkinsci/plugins/docker/workflow/client/DockerClientTest.java +++ b/src/test/java/org/jenkinsci/plugins/docker/workflow/client/DockerClientTest.java @@ -58,9 +58,10 @@ public void setup() throws Exception { @Test public void test_run() throws IOException, InterruptedException { EnvVars launchEnv = DockerTestUtil.newDockerLaunchEnv(); + String[] defaultCommand = DockerClient.getUnixCommand(DockerTestUtil.newHostEnv(), "cat"); String containerId = dockerClient.run(launchEnv, "learn/tutorial", null, null, Collections.emptyMap(), Collections.emptyList(), new EnvVars(), - dockerClient.whoAmI(), "cat"); + dockerClient.whoAmI(), defaultCommand); Assert.assertEquals(64, containerId.length()); ContainerRecord containerRecord = dockerClient.getContainerRecord(launchEnv, containerId); Assert.assertEquals(dockerClient.inspect(launchEnv, "learn/tutorial", ".Id"), containerRecord.getImageId());