Skip to content

Commit 4b80f24

Browse files
lberkiCopybara-Service
authored and
Copybara-Service
committed
Add option to enable Docker sandboxing.
RELNOTES: None. PiperOrigin-RevId: 199467128
1 parent 188a29a commit 4b80f24

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

src/main/java/com/google/devtools/build/lib/sandbox/SandboxActionContextProvider.java

+30-22
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.devtools.build.lib.actions.Spawn;
2323
import com.google.devtools.build.lib.actions.SpawnResult;
2424
import com.google.devtools.build.lib.actions.Spawns;
25+
import com.google.devtools.build.lib.events.Event;
2526
import com.google.devtools.build.lib.exec.ActionContextProvider;
2627
import com.google.devtools.build.lib.exec.SpawnRunner;
2728
import com.google.devtools.build.lib.exec.apple.XcodeLocalEnvProvider;
@@ -71,28 +72,35 @@ public static SandboxActionContextProvider create(CommandEnvironment cmdEnv, Pat
7172
contexts.add(new ProcessWrapperSandboxedStrategy(cmdEnv.getExecRoot(), spawnRunner));
7273
}
7374

74-
// This strategy uses Docker to execute spawns. It should work on all platforms that support
75-
// Docker.
76-
getPathToDockerClient(cmdEnv)
77-
.ifPresent(
78-
dockerClient -> {
79-
if (DockerSandboxedSpawnRunner.isSupported(cmdEnv, dockerClient)) {
80-
String defaultImage = options.getOptions(SandboxOptions.class).dockerImage;
81-
boolean useCustomizedImages =
82-
options.getOptions(SandboxOptions.class).dockerUseCustomizedImages;
83-
SpawnRunner spawnRunner =
84-
withFallback(
85-
cmdEnv,
86-
new DockerSandboxedSpawnRunner(
87-
cmdEnv,
88-
dockerClient,
89-
sandboxBase,
90-
defaultImage,
91-
timeoutKillDelay,
92-
useCustomizedImages));
93-
contexts.add(new DockerSandboxedStrategy(cmdEnv.getExecRoot(), spawnRunner));
94-
}
95-
});
75+
SandboxOptions sandboxOptions = options.getOptions(SandboxOptions.class);
76+
77+
if (sandboxOptions.enableDockerSandbox) {
78+
// This strategy uses Docker to execute spawns. It should work on all platforms that support
79+
// Docker.
80+
getPathToDockerClient(cmdEnv)
81+
.ifPresent(
82+
dockerClient -> {
83+
if (DockerSandboxedSpawnRunner.isSupported(cmdEnv, dockerClient)) {
84+
String defaultImage = sandboxOptions.dockerImage;
85+
boolean useCustomizedImages = sandboxOptions.dockerUseCustomizedImages;
86+
SpawnRunner spawnRunner =
87+
withFallback(
88+
cmdEnv,
89+
new DockerSandboxedSpawnRunner(
90+
cmdEnv,
91+
dockerClient,
92+
sandboxBase,
93+
defaultImage,
94+
timeoutKillDelay,
95+
useCustomizedImages));
96+
contexts.add(new DockerSandboxedStrategy(cmdEnv.getExecRoot(), spawnRunner));
97+
}
98+
});
99+
} else if (sandboxOptions.dockerVerbose) {
100+
cmdEnv.getReporter().handle(Event.info(
101+
"Docker sandboxing disabled. Use the '--experimental_enable_docker_sandbox' command "
102+
+ "line option to enable it"));
103+
}
96104

97105
// This is the preferred sandboxing strategy on Linux.
98106
if (LinuxSandboxedSpawnRunner.isSupported(cmdEnv)) {

src/main/java/com/google/devtools/build/lib/sandbox/SandboxOptions.java

+8
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@ public ImmutableSet<Path> getInaccessiblePaths(FileSystem fs) {
218218
)
219219
public boolean collectLocalSandboxExecutionStatistics;
220220

221+
@Option(
222+
name = "experimental_enable_docker_sandbox",
223+
defaultValue = "false",
224+
documentationCategory = OptionDocumentationCategory.EXECUTION_STRATEGY,
225+
effectTags = {OptionEffectTag.EXECUTION},
226+
help = "Enable Docker-based sandboxing. This option has no effect if Docker is not installed.")
227+
public boolean enableDockerSandbox;
228+
221229
@Option(
222230
name = "experimental_docker_image",
223231
defaultValue = "",

0 commit comments

Comments
 (0)