public UUID build()

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;
    }