in plugins/docker/base-image/src/main/java/co/elastic/gradle/dockerbase/DockerDaemonActions.java [322:389]
public UUID build() throws IOException {
checkVersion();
Files.createDirectories(workingDir);
synchronizeFiles();
generateEphemeralRepositories();
{
final String baseImage = buildable.getActualInstructions().stream()
.filter(each -> each instanceof FromImageReference)
.map(each -> ((FromImageReference) each).getReference().get())
.findFirst()
.orElseThrow(() -> new GradleException("A base image is not configured "));
final ByteArrayOutputStream whoAmIOut = new ByteArrayOutputStream();
dockerUtils.exec(execSpec -> {
execSpec.setStandardOutput(whoAmIOut);
execSpec.commandLine("docker", "run", "--rm", "--entrypoint", "/bin/sh", baseImage, "-c", "'whoami'");
});
user = whoAmIOut.toString().trim();
}
Path dockerFile = workingDir.resolve("Dockerfile");
Files.writeString(
dockerFile,
dockerFileFromInstructions()
);
Files.writeString(
workingDir.resolve(".dockerignore"),
"**\n" + Stream.concat(
Stream.of(
workingDir.relativize(getContextDir())
),
getBindMounts().values().stream()
.map(each -> workingDir.relativize(each).toString())
)
.map(each -> "!" + each)
.collect(Collectors.joining("\n"))
);
// We build with --no-cache to make things more straight forward, since we already cache images using Gradle's build cache
int imageBuild = dockerUtils.exec(spec -> {
spec.setWorkingDir(dockerFile.getParent().toFile());
if (System.getProperty("co.elastic.unsafe.use-docker-cache", "false").equals("true")) {
// This is usefull for development when we don't care about image corectness, but otherwhise dagerous,
// e.g. dockerEphemeral content in run commands could lead to incorrect results
spec.commandLine("docker", "image", "build", "--platform", "linux/" + buildable.getArchitecture().get().dockerName(),
"--quiet=false",
"--progress=plain",
"--iidfile=" + buildable.getImageIdFile().get().getAsFile(), ".", "-t",
uuid
);
} else {
spec.commandLine("docker", "image", "build", "--platform", "linux/" + buildable.getArchitecture().get().dockerName(),
"--quiet=false",
"--no-cache",
"--progress=plain",
"--iidfile=" + buildable.getImageIdFile().get().getAsFile(), ".", "-t",
uuid
);
}
spec.setIgnoreExitValue(true);
}).getExitValue();
if (imageBuild != 0) {
throw new GradleException("Failed to build docker image, see the docker build log in the task output");
}
return uuid;
}