diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java index 384bc5e0e27..223db216ecb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java @@ -265,6 +265,9 @@ @InterfaceAudience.Private public static final String ENV_DOCKER_CONTAINER_YARN_SYSFS = "YARN_CONTAINER_RUNTIME_YARN_SYSFS_ENABLE"; + @InterfaceAudience.Private + public static final String ENV_DOCKER_CONTAINER_DOCKER_RUNTIME = + "YARN_CONTAINER_RUNTIME_DOCKER_RUNTIME"; public static final String YARN_SYSFS_PATH = "/hadoop/yarn/sysfs"; private Configuration conf; @@ -801,6 +804,7 @@ public void launchContainer(ContainerRuntimeContext ctx) String imageName = environment.get(ENV_DOCKER_CONTAINER_IMAGE); String network = environment.get(ENV_DOCKER_CONTAINER_NETWORK); String hostname = environment.get(ENV_DOCKER_CONTAINER_HOSTNAME); + String runtime = environment.get(ENV_DOCKER_CONTAINER_DOCKER_RUNTIME); boolean useEntryPoint = checkUseEntryPoint(environment); if (imageName == null || imageName.isEmpty()) { @@ -886,6 +890,9 @@ public void launchContainer(ContainerRuntimeContext ctx) } runCommand.setCapabilities(capabilities); + if (runtime != null && !runtime.isEmpty()) { + runCommand.addRuntime(runtime); + } runCommand.addAllReadWriteMountLocations(containerLogDirs); runCommand.addAllReadWriteMountLocations(applicationLocalDirs); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java index 6669cac6d43..be70ab82ef0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java @@ -2481,6 +2481,25 @@ public void testDockerContainerRelaunch() dockerCommands.get(counter)); } + @Test + public void testLaunchContainersWithSpecificDockerRuntime() + throws ContainerExecutionException, PrivilegedOperationException, + IOException { + DockerLinuxContainerRuntime runtime = new DockerLinuxContainerRuntime( + mockExecutor, mockCGroupsHandler); + runtime.initialize(conf, nmContext); + + env.put(DockerLinuxContainerRuntime + .ENV_DOCKER_CONTAINER_DOCKER_RUNTIME, ""); + runtime.launchContainer(builder.build()); + + env.put(DockerLinuxContainerRuntime + .ENV_DOCKER_CONTAINER_DOCKER_RUNTIME, "invalid-runtime"); + runtime.launchContainer(builder.build()); + List dockerCommands = readDockerCommands(); + Assert.assertEquals(13, dockerCommands.size()); + } + private static void verifyStopCommand(List dockerCommands, String signal) { Assert.assertEquals(4, dockerCommands.size());