From 1d5fe78af97c456591592acf9adf328f8a7454d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Thu, 25 Feb 2021 12:46:30 +0100 Subject: [PATCH 1/2] JENKINS-64954: add test for docker connection tracking --- .../workflow/WithContainerStepTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/org/jenkinsci/plugins/docker/workflow/WithContainerStepTest.java b/src/test/java/org/jenkinsci/plugins/docker/workflow/WithContainerStepTest.java index 4c9a97447..0c5fa03c7 100644 --- a/src/test/java/org/jenkinsci/plugins/docker/workflow/WithContainerStepTest.java +++ b/src/test/java/org/jenkinsci/plugins/docker/workflow/WithContainerStepTest.java @@ -455,4 +455,23 @@ private static final class Execution extends SynchronousNonBlockingStepExecution } } + @Test + @Issue("JENKINS-64954") + public void dockerConnectionTracking() { + story.then(r -> { + DockerTestUtil.assumeDocker(); + WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); + p.setDefinition(new CpsFlowDefinition("node {\n" + + " docker.image(\"docker:dind\").withRun(\"--privileged\", \"dockerd --tls=false --host 0.0.0.0\") { dockerContainer ->\n" + + " docker.image(\"docker:dind\").inside(\"--link ${dockerContainer.id}:docker --entrypoint=''\") {\n" + + " docker.withServer(\"tcp://docker\") {\n" + + " sh \"echo with nested docker\"\n" + + " }\n" + + " }\n" + + " }\n" + + "}", true)); + WorkflowRun b = story.j.assertBuildStatusSuccess(p.scheduleBuild2(0)); + story.j.assertLogContains("with nested docker", b); + }); + } } From 27e506dfbe4c5eef358307777fee6bbf597f194d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Date: Thu, 25 Feb 2021 12:48:15 +0100 Subject: [PATCH 2/2] JENKINS-64954: keep track of docker connection --- .../plugins/docker/workflow/WithContainerStep.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 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 ebbfd68a3..667ccee47 100644 --- a/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java +++ b/src/main/java/org/jenkinsci/plugins/docker/workflow/WithContainerStep.java @@ -42,6 +42,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -206,8 +207,9 @@ public Execution() { } ImageAction.add(step.image, run); + String dockerHost = envHost.get("DOCKER_HOST", "unix:///var/run/docker.sock"); getContext().newBodyInvoker(). - withContext(BodyInvoker.mergeLauncherDecorators(getContext().get(LauncherDecorator.class), new Decorator(container, envHost, ws, toolName, dockerVersion))). + withContext(BodyInvoker.mergeLauncherDecorators(getContext().get(LauncherDecorator.class), new Decorator(container, dockerHost, envHost, ws, toolName, dockerVersion))). withCallback(new Callback(container, toolName)). start(); return false; @@ -240,14 +242,16 @@ private static class Decorator extends LauncherDecorator implements Serializable private static final long serialVersionUID = 1; private final String container; + private final String dockerHost; private final String[] envHost; private final String ws; private final @CheckForNull String toolName; private final boolean hasEnv; private final boolean hasWorkdir; - Decorator(String container, EnvVars envHost, String ws, String toolName, VersionNumber dockerVersion) { + Decorator(String container, String dockerHost, EnvVars envHost, String ws, String toolName, VersionNumber dockerVersion) { this.container = container; + this.dockerHost = dockerHost; this.envHost = Util.mapToEnv(envHost); this.ws = ws; this.toolName = toolName; @@ -332,6 +336,8 @@ private static class Decorator extends LauncherDecorator implements Serializable System.arraycopy(originalMasks, 0, masks, prefix.size(), originalMasks.length); starter.masks(masks); + starter.envs(Collections.singletonMap("DOCKER_HOST", dockerHost)); + return super.launch(starter); } @Override public void kill(Map modelEnvVars) throws IOException, InterruptedException {