diff --git a/distribution/docker/build.gradle b/distribution/docker/build.gradle index 1e8075d6cbe80..82a1081e51ecc 100644 --- a/distribution/docker/build.gradle +++ b/distribution/docker/build.gradle @@ -425,12 +425,12 @@ void addBuildDockerImageTask(Architecture architecture, DockerBase base) { } void addBuildEssDockerImageTask(Architecture architecture) { - DockerBase base = DockerBase.CLOUD_ESS + DockerBase dockerBase = DockerBase.CLOUD_ESS String arch = architecture == Architecture.AARCH64 ? '-aarch64' : '' - String contextDir = "${project.buildDir}/docker-context/elasticsearch${base.suffix}-${VersionProperties.elasticsearch}-docker-build-context${arch}" + String contextDir = "${project.buildDir}/docker-context/elasticsearch${dockerBase.suffix}-${VersionProperties.elasticsearch}-docker-build-context${arch}" final TaskProvider buildContextTask = - tasks.register(taskName('build', architecture, base, 'DockerContext'), Sync) { + tasks.register(taskName('build', architecture, dockerBase, 'DockerContext'), Sync) { into contextDir final Path projectDir = project.projectDir.toPath() @@ -439,28 +439,52 @@ void addBuildEssDockerImageTask(Architecture architecture) { from configurations.allPlugins } - from(projectDir.resolve("src/docker/Dockerfile.cloud-ess")) { - expand([ - base_image: "elasticsearch${DockerBase.CLOUD.suffix}:${architecture.classifier}" - ]) + // If we're performing a release build, but `build.id` hasn't been set, we can + // infer that we're not at the Docker building stage of the build, and therefore + // we should skip the beats part of the build. + String buildId = providers.systemProperty('build.id').getOrNull() + boolean includeBeats = VersionProperties.isElasticsearchSnapshot() == true || buildId != null || useDra + + if (includeBeats) { + from configurations.getByName("filebeat_${architecture.classifier}") + from configurations.getByName("metricbeat_${architecture.classifier}") + } + // For some reason, the artifact name can differ depending on what repository we used. + rename ~/((?:file|metric)beat)-.*\.tar\.gz$/, "\$1-${VersionProperties.elasticsearch}.tar.gz" + + String baseSuffix = DockerBase.DEFAULT.suffix + from(projectDir.resolve("src/docker/Dockerfile.ess")) { + expand( + [ + base_image: "elasticsearch${baseSuffix}:${architecture.classifier}", + docker_base: "${dockerBase.name().toLowerCase()}", + version: "${VersionProperties.elasticsearch}", + retry: ShellRetry + ] + ) filter SquashNewlinesFilter - rename ~/Dockerfile\.cloud-ess$/, 'Dockerfile' + rename ~/Dockerfile\.ess$/, 'Dockerfile' } } final TaskProvider buildDockerImageTask = - tasks.register(taskName("build", architecture, base, "DockerImage"), DockerBuildTask) { + tasks.register(taskName("build", architecture, dockerBase, "DockerImage"), DockerBuildTask) { - TaskProvider buildCloudTask = tasks.named(taskName("build", architecture, DockerBase.CLOUD, "DockerImage")) - inputs.files(buildCloudTask) + DockerBase base = DockerBase.DEFAULT + + TaskProvider buildBaseTask = tasks.named(taskName("build", architecture, base, "DockerImage")) + inputs.files(buildBaseTask) dockerContext.fileProvider(buildContextTask.map { it.getDestinationDir() }) noCache = buildParams.isCi() baseImages = [] - tags = generateTags(base, architecture) + tags = generateTags(dockerBase, architecture) platforms.add(architecture.dockerPlatform) - Provider serviceProvider = GradleUtils.getBuildService(project.gradle.sharedServices, DockerSupportPlugin.DOCKER_SUPPORT_SERVICE_NAME) + Provider serviceProvider = GradleUtils.getBuildService( + project.gradle.sharedServices, + DockerSupportPlugin.DOCKER_SUPPORT_SERVICE_NAME + ) onlyIf("$architecture supported") { serviceProvider.get().isArchitectureSupported(architecture) } } diff --git a/distribution/docker/src/docker/Dockerfile.cloud-ess b/distribution/docker/src/docker/Dockerfile.cloud-ess deleted file mode 100644 index f82752d67a284..0000000000000 --- a/distribution/docker/src/docker/Dockerfile.cloud-ess +++ /dev/null @@ -1,13 +0,0 @@ -FROM ${base_image} AS builder - -USER root - -COPY plugins/*.zip /opt/plugins/archive/ - -RUN chown root.root /opt/plugins/archive/* -RUN chmod 0444 /opt/plugins/archive/* - -FROM ${base_image} - -COPY --from=builder /opt/plugins /opt/plugins -ENV ES_PLUGIN_ARCHIVE_DIR /opt/plugins/archive diff --git a/distribution/docker/src/docker/Dockerfile.ess b/distribution/docker/src/docker/Dockerfile.ess new file mode 100644 index 0000000000000..933d8efd03c95 --- /dev/null +++ b/distribution/docker/src/docker/Dockerfile.ess @@ -0,0 +1,44 @@ +FROM ${base_image} AS builder + +USER root + +# Add plugins infrastructure +RUN mkdir -p /opt/plugins/archive +RUN chmod -R 0555 /opt/plugins + +COPY filebeat-${version}.tar.gz metricbeat-${version}.tar.gz /tmp/ +RUN set -eux ; \\ + for beat in filebeat metricbeat ; do \\ + if [ ! -s /tmp/\$beat-${version}.tar.gz ]; then \\ + echo "/tmp/\$beat-${version}.tar.gz is empty - cannot uncompress" 2>&1 ; \\ + exit 1 ; \\ + fi ; \\ + if ! tar tf /tmp/\$beat-${version}.tar.gz >/dev/null; then \\ + echo "/tmp/\$beat-${version}.tar.gz is corrupt - cannot uncompress" 2>&1 ; \\ + exit 1 ; \\ + fi ; \\ + mkdir -p /opt/\$beat ; \\ + tar xf /tmp/\$beat-${version}.tar.gz -C /opt/\$beat --strip-components=1 ; \\ + done + +COPY plugins/*.zip /opt/plugins/archive/ + +RUN chown 1000:1000 /opt/plugins/archive/* +RUN chmod 0444 /opt/plugins/archive/* + +FROM ${base_image} +USER root + +RUN <%= retry.loop("apt-get", "export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends wget") %> + +# tweak entry point for ESS specific wolfi image +ENTRYPOINT ["/sbin/tini", "--"] +CMD ["/app/elasticsearch.sh"] +# Generate a stub command that will be overwritten at runtime +RUN mkdir /app && \\ + echo -e '#!/bin/bash\\nexec /usr/local/bin/docker-entrypoint.sh eswrapper' > /app/elasticsearch.sh && \\ + chmod 0555 /app/elasticsearch.sh + +COPY --from=builder --chown=0:0 /opt /opt +USER 1000:0 +ENV ES_PLUGIN_ARCHIVE_DIR /opt/plugins/archive