|  | @@ -14,40 +14,41 @@ apply plugin: 'elasticsearch.test.fixtures'
 | 
	
		
			
				|  |  |  apply plugin: 'elasticsearch.internal-distribution-download'
 | 
	
		
			
				|  |  |  apply plugin: 'elasticsearch.rest-resources'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Define a repository that allows Gradle to fetch a resource from GitHub. This
 | 
	
		
			
				|  |  | +// is only used to fetch the `tini` binary, when building the Iron Bank docker image
 | 
	
		
			
				|  |  | +// for testing purposes.
 | 
	
		
			
				|  |  | +repositories {
 | 
	
		
			
				|  |  | +  ivy {
 | 
	
		
			
				|  |  | +    url 'https://github.com/'
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    patternLayout {
 | 
	
		
			
				|  |  | +      artifact '/[organisation]/[module]/releases/download/v[revision]/[ext]'
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // This is required in Gradle 6.0+ as metadata file (ivy.xml)
 | 
	
		
			
				|  |  | +    // is mandatory. Docs linked below this code section
 | 
	
		
			
				|  |  | +    metadataSources { artifact() }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  testFixtures.useFixture()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  configurations {
 | 
	
		
			
				|  |  |    aarch64DockerSource
 | 
	
		
			
				|  |  |    dockerSource
 | 
	
		
			
				|  |  |    transformLog4jJar
 | 
	
		
			
				|  |  | +  tini
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  dependencies {
 | 
	
		
			
				|  |  |    aarch64DockerSource project(path: ":distribution:archives:linux-aarch64-tar", configuration: 'default')
 | 
	
		
			
				|  |  |    dockerSource project(path: ":distribution:archives:linux-tar", configuration: 'default')
 | 
	
		
			
				|  |  |    transformLog4jJar project(path: ":distribution:docker:transform-log4j-config", configuration: 'default')
 | 
	
		
			
				|  |  | +  tini 'krallin:tini:0.19.0@tini-amd64'
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -ext.expansions = { Architecture architecture, DockerBase base, boolean local ->
 | 
	
		
			
				|  |  | -  String classifier
 | 
	
		
			
				|  |  | -  if (local) {
 | 
	
		
			
				|  |  | -    if (architecture == Architecture.AARCH64) {
 | 
	
		
			
				|  |  | -      classifier = "linux-aarch64"
 | 
	
		
			
				|  |  | -    } else if (architecture == Architecture.X64) {
 | 
	
		
			
				|  |  | -      classifier = "linux-x86_64"
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      throw new IllegalArgumentException("Unsupported architecture [" + architecture + "]")
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    /* When sourcing the Elasticsearch build remotely, the same Dockerfile needs
 | 
	
		
			
				|  |  | -     * to be able to fetch the artifact for any supported platform. We can't make
 | 
	
		
			
				|  |  | -     * the decision here. Bash will interpolate the `arch` command for us. */
 | 
	
		
			
				|  |  | -    classifier = "linux-\$(arch)"
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  final String elasticsearch = "elasticsearch-${VersionProperties.elasticsearch}-${classifier}.tar.gz"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  String buildArgs = '#'
 | 
	
		
			
				|  |  | +ext.expansions = { Architecture architecture, DockerBase base ->
 | 
	
		
			
				|  |  | +  String buildArgs = ''
 | 
	
		
			
				|  |  |    if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  |      buildArgs = """
 | 
	
		
			
				|  |  |  ARG BASE_REGISTRY=nexus-docker-secure.levelup-nexus.svc.cluster.local:18082
 | 
	
	
		
			
				|  | @@ -56,21 +57,6 @@ ARG BASE_TAG=8.3
 | 
	
		
			
				|  |  |  """
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* Both the following Dockerfile commands put the resulting artifact at
 | 
	
		
			
				|  |  | -   * the same location, regardless of classifier, so that the commands that
 | 
	
		
			
				|  |  | -   * follow in the Dockerfile don't have to know about the runtime
 | 
	
		
			
				|  |  | -   * architecture. */
 | 
	
		
			
				|  |  | -  String sourceElasticsearch
 | 
	
		
			
				|  |  | -  if (local) {
 | 
	
		
			
				|  |  | -    sourceElasticsearch = "COPY $elasticsearch /opt/elasticsearch.tar.gz"
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    sourceElasticsearch = """
 | 
	
		
			
				|  |  | -RUN curl --retry 10 -S -L \\
 | 
	
		
			
				|  |  | -      --output /opt/elasticsearch.tar.gz \\
 | 
	
		
			
				|  |  | -      https://artifacts-no-kpi.elastic.co/downloads/elasticsearch/$elasticsearch
 | 
	
		
			
				|  |  | -""".trim()
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    def (major,minor) = VersionProperties.elasticsearch.split("\\.")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return [
 | 
	
	
		
			
				|  | @@ -82,7 +68,6 @@ RUN curl --retry 10 -S -L \\
 | 
	
		
			
				|  |  |      'git_revision'        : BuildParams.gitRevision,
 | 
	
		
			
				|  |  |      'license'             : 'Elastic-License-2.0',
 | 
	
		
			
				|  |  |      'package_manager'     : base == DockerBase.UBI ? 'microdnf' : 'yum',
 | 
	
		
			
				|  |  | -    'source_elasticsearch': sourceElasticsearch,
 | 
	
		
			
				|  |  |      'docker_base'         : base.name().toLowerCase(),
 | 
	
		
			
				|  |  |      'version'             : VersionProperties.elasticsearch,
 | 
	
		
			
				|  |  |      'major_minor_version' : "${major}.${minor}",
 | 
	
	
		
			
				|  | @@ -100,14 +85,6 @@ class SquashNewlinesFilter extends FilterReader {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -private static String buildPath(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | -  return 'build/' +
 | 
	
		
			
				|  |  | -    (architecture == Architecture.AARCH64 ? 'aarch64-' : '') +
 | 
	
		
			
				|  |  | -    (base == DockerBase.UBI ? 'ubi-' : '') +
 | 
	
		
			
				|  |  | -    (base == DockerBase.UBI ? 'ubi-' : (base == DockerBase.IRON_BANK ? 'ironbank-' : '')) +
 | 
	
		
			
				|  |  | -    'docker'
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  private static String taskName(String prefix, Architecture architecture, DockerBase base, String suffix) {
 | 
	
		
			
				|  |  |    return prefix +
 | 
	
		
			
				|  |  |      (architecture == Architecture.AARCH64 ? 'Aarch64' : '') +
 | 
	
	
		
			
				|  | @@ -115,55 +92,32 @@ private static String taskName(String prefix, Architecture architecture, DockerB
 | 
	
		
			
				|  |  |      suffix
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -project.ext {
 | 
	
		
			
				|  |  | -  dockerBuildContext = { Architecture architecture, DockerBase base, boolean local ->
 | 
	
		
			
				|  |  | -    copySpec {
 | 
	
		
			
				|  |  | -      final Map<String,String> varExpansions = expansions(architecture, base, local)
 | 
	
		
			
				|  |  | -      final Path projectDir = project.projectDir.toPath()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  | -        into('scripts') {
 | 
	
		
			
				|  |  | -          from projectDir.resolve("src/docker/bin")
 | 
	
		
			
				|  |  | -          from(projectDir.resolve("src/docker/config"))
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        from(projectDir.resolve("src/docker/iron_bank")) {
 | 
	
		
			
				|  |  | -          expand(varExpansions)
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        into('bin') {
 | 
	
		
			
				|  |  | -          from projectDir.resolve("src/docker/bin")
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +ext.dockerBuildContext = { Architecture architecture, DockerBase base ->
 | 
	
		
			
				|  |  | +  copySpec {
 | 
	
		
			
				|  |  | +    final Map<String,String> varExpansions = expansions(architecture, base)
 | 
	
		
			
				|  |  | +    final Path projectDir = project.projectDir.toPath()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        into('config') {
 | 
	
		
			
				|  |  | -          from projectDir.resolve("src/docker/config")
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +    if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  | +      into('scripts') {
 | 
	
		
			
				|  |  | +        from projectDir.resolve("src/docker/bin")
 | 
	
		
			
				|  |  | +        from projectDir.resolve("src/docker/config")
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -      from(project.projectDir.toPath().resolve("src/docker/Dockerfile")) {
 | 
	
		
			
				|  |  | +      from(projectDir.resolve("src/docker/iron_bank")) {
 | 
	
		
			
				|  |  |          expand(varExpansions)
 | 
	
		
			
				|  |  | -        filter SquashNewlinesFilter
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void addCopyDockerContextTask(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | -  tasks.register(taskName("copy", architecture, base, "DockerContext"), Sync) {
 | 
	
		
			
				|  |  | -    expansions(architecture, base, true).findAll { it.key != 'build_date' }.each { k, v ->
 | 
	
		
			
				|  |  | -      inputs.property(k, { v.toString() })
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    into buildPath(architecture, base)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    with dockerBuildContext(architecture, base, true)
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      into('bin') {
 | 
	
		
			
				|  |  | +        from projectDir.resolve("src/docker/bin")
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    into('bin') {
 | 
	
		
			
				|  |  | -      from configurations.transformLog4jJar
 | 
	
		
			
				|  |  | +      into('config') {
 | 
	
		
			
				|  |  | +        from projectDir.resolve("src/docker/config")
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (architecture == Architecture.AARCH64) {
 | 
	
		
			
				|  |  | -        from configurations.aarch64DockerSource
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -        from configurations.dockerSource
 | 
	
		
			
				|  |  | +    from(project.projectDir.toPath().resolve("src/docker/Dockerfile")) {
 | 
	
		
			
				|  |  | +      expand(varExpansions)
 | 
	
		
			
				|  |  | +      filter SquashNewlinesFilter
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -211,7 +165,6 @@ tasks.named("preProcessFixture").configure {
 | 
	
		
			
				|  |  |      )
 | 
	
		
			
				|  |  |      createAndSetWritable(
 | 
	
		
			
				|  |  |        "${buildDir}/repo",
 | 
	
		
			
				|  |  | -      "${buildDir}/oss-repo",
 | 
	
		
			
				|  |  |        "${buildDir}/logs/default-1",
 | 
	
		
			
				|  |  |        "${buildDir}/logs/default-2",
 | 
	
		
			
				|  |  |      )
 | 
	
	
		
			
				|  | @@ -236,52 +189,131 @@ tasks.named("check").configure {
 | 
	
		
			
				|  |  |    dependsOn "integTest"
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void addBuildDockerImage(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | -  final TaskProvider<DockerBuildTask> buildDockerImageTask =
 | 
	
		
			
				|  |  | -          tasks.register(taskName("build", architecture, base, "DockerImage"), DockerBuildTask) {
 | 
	
		
			
				|  |  | -    onlyIf { Architecture.current() == architecture }
 | 
	
		
			
				|  |  | -    TaskProvider<Sync> copyContextTask = tasks.named(taskName("copy", architecture, base, "DockerContext"))
 | 
	
		
			
				|  |  | -    dependsOn(copyContextTask)
 | 
	
		
			
				|  |  | -    dockerContext.fileProvider(copyContextTask.map { it.destinationDir })
 | 
	
		
			
				|  |  | +// We build the images used in compose locally, but the pull command insists on using a repository
 | 
	
		
			
				|  |  | +// thus we must disable it to prevent it from doing so.
 | 
	
		
			
				|  |  | +// Everything will still be pulled since we will build the local images on a pull
 | 
	
		
			
				|  |  | +tasks.named("composePull").configure {
 | 
	
		
			
				|  |  | +  enabled = false
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    if (base == DockerBase.UBI) {
 | 
	
		
			
				|  |  | -      baseImages = [ base.getImage() ]
 | 
	
		
			
				|  |  | +void addBuildDockerContextTask(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | +  String binDirectory = base == DockerBase.IRON_BANK ? 'scripts' : 'bin'
 | 
	
		
			
				|  |  | +  String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  final TaskProvider<DockerBuildTask> buildContextTask =
 | 
	
		
			
				|  |  | +    tasks.register(taskName('build', architecture, base, 'DockerContext'), Tar) {
 | 
	
		
			
				|  |  | +      archiveExtension = 'tar.gz'
 | 
	
		
			
				|  |  | +      compression = Compression.GZIP
 | 
	
		
			
				|  |  | +      archiveClassifier = "docker-build-context${arch}"
 | 
	
		
			
				|  |  | +      archiveBaseName = "elasticsearch${base.suffix}"
 | 
	
		
			
				|  |  | +      with dockerBuildContext(architecture, base)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      into (binDirectory) {
 | 
	
		
			
				|  |  | +        from configurations.transformLog4jJar
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      onlyIf { Architecture.current() == architecture }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void addUnpackDockerContextTask(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | +  tasks.register(taskName("transform", architecture, base, "DockerContext"), Sync) {
 | 
	
		
			
				|  |  | +    TaskProvider<Tar> buildContextTask = tasks.named(taskName("build", architecture, base, "DockerContext"))
 | 
	
		
			
				|  |  | +    dependsOn(buildContextTask)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
 | 
	
		
			
				|  |  | +    String archiveName = "elasticsearch${base.suffix}-${VersionProperties.elasticsearch}-docker-build-context${arch}"
 | 
	
		
			
				|  |  | +    String distributionName = "elasticsearch-${VersionProperties.elasticsearch}-linux-${architecture.classifier}.tar.gz"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    from(tarTree("${project.buildDir}/distributions/${archiveName}.tar.gz")) {
 | 
	
		
			
				|  |  | +      eachFile { FileCopyDetails details ->
 | 
	
		
			
				|  |  | +        if (details.name.equals("Dockerfile")) {
 | 
	
		
			
				|  |  | +          filter { it.replaceAll('^RUN curl.*artifacts-no-kpi.*$', "COPY ${distributionName} /opt/elasticsearch.tar.gz")}
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    into "${project.buildDir}/docker-context/${archiveName}"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Since we replaced the remote URL in the Dockerfile, copy in the required file
 | 
	
		
			
				|  |  | +    if (architecture == Architecture.AARCH64) {
 | 
	
		
			
				|  |  | +      from configurations.aarch64DockerSource
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      baseImages = [ base.getImage(), 'alpine:latest' ]
 | 
	
		
			
				|  |  | +      from configurations.dockerSource
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  | +      from (configurations.tini) {
 | 
	
		
			
				|  |  | +        rename { _ -> 'tini' }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    String version = VersionProperties.elasticsearch
 | 
	
		
			
				|  |  | -    String suffix = base == DockerBase.UBI ? '-ubi8' : ''
 | 
	
		
			
				|  |  | -    tags = [
 | 
	
		
			
				|  |  | -      "elasticsearch${suffix}:${version}",
 | 
	
		
			
				|  |  | -      "docker.elastic.co/elasticsearch/elasticsearch${suffix}:${version}",
 | 
	
		
			
				|  |  | -      "docker.elastic.co/elasticsearch/elasticsearch-full${suffix}:${version}",
 | 
	
		
			
				|  |  | -      "elasticsearch${suffix}:test"
 | 
	
		
			
				|  |  | -    ]
 | 
	
		
			
				|  |  | +    expansions(architecture, base).findAll { it.key != 'build_date' }.each { k, v ->
 | 
	
		
			
				|  |  | +      inputs.property(k, { v.toString() })
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    onlyIf { Architecture.current() == architecture }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +private List<String> generateTags(DockerBase base) {
 | 
	
		
			
				|  |  | +  String version = VersionProperties.elasticsearch
 | 
	
		
			
				|  |  | +  return [
 | 
	
		
			
				|  |  | +    "elasticsearch${base.suffix}:test",
 | 
	
		
			
				|  |  | +    "elasticsearch${base.suffix}:${version}",
 | 
	
		
			
				|  |  | +    "docker.elastic.co/elasticsearch/elasticsearch${base.suffix}:${version}"
 | 
	
		
			
				|  |  | +  ]
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void addBuildDockerImageTask(Architecture architecture, DockerBase base) {
 | 
	
		
			
				|  |  | +  final TaskProvider<DockerBuildTask> buildDockerImageTask =
 | 
	
		
			
				|  |  | +    tasks.register(taskName("build", architecture, base, "DockerImage"), DockerBuildTask) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      TaskProvider<Tar> transformTask = tasks.named(taskName("transform", architecture, base, "DockerContext"))
 | 
	
		
			
				|  |  | +      dependsOn(transformTask)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      dockerContext.fileProvider(transformTask.map { it.destinationDir })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      tags = generateTags(base)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  | +        Map<String, String> buildArgsMap = [
 | 
	
		
			
				|  |  | +          'BASE_REGISTRY': 'docker.elastic.co',
 | 
	
		
			
				|  |  | +          'BASE_IMAGE': 'ubi8/ubi',
 | 
	
		
			
				|  |  | +          'BASE_TAG': 'latest'
 | 
	
		
			
				|  |  | +        ]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Iron Bank has a single, parameterized base image
 | 
	
		
			
				|  |  | +        String baseImage = base.image
 | 
	
		
			
				|  |  | +        for (String key : buildArgsMap.keySet()) {
 | 
	
		
			
				|  |  | +          baseImage = baseImage.replace('${' + key + '}', buildArgsMap.get(key))
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        baseImages = [baseImage]
 | 
	
		
			
				|  |  | +        buildArgs = buildArgsMap
 | 
	
		
			
				|  |  | +      } else if (base == DockerBase.CENTOS) {
 | 
	
		
			
				|  |  | +        baseImages = ['alpine:latest', base.image]
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        baseImages = [base.image]
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      onlyIf { Architecture.current() == architecture }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    tasks.named("assemble").configure {
 | 
	
		
			
				|  |  |      dependsOn(buildDockerImageTask)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  for (final Architecture architecture : Architecture.values()) {
 | 
	
		
			
				|  |  |    for (final DockerBase base : DockerBase.values()) {
 | 
	
		
			
				|  |  | -    if (base == DockerBase.IRON_BANK) {
 | 
	
		
			
				|  |  | -      // At the moment we don't actually build the Iron Bank image
 | 
	
		
			
				|  |  | -      continue
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    addCopyDockerContextTask(architecture, base)
 | 
	
		
			
				|  |  | -    addBuildDockerImage(architecture, base)
 | 
	
		
			
				|  |  | +    addBuildDockerContextTask(architecture, base)
 | 
	
		
			
				|  |  | +    addUnpackDockerContextTask(architecture, base)
 | 
	
		
			
				|  |  | +    addBuildDockerImageTask(architecture, base)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -// We build the images used in compose locally, but the pull command insists on using a repository
 | 
	
		
			
				|  |  | -// thus we must disable it to prevent it from doing so.
 | 
	
		
			
				|  |  | -// Everything will still be pulled since we will build the local images on a pull
 | 
	
		
			
				|  |  | -tasks.named("composePull").configure {
 | 
	
		
			
				|  |  | -  enabled = false
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  /*
 | 
	
		
			
				|  |  |   * The export subprojects write out the generated Docker images to disk, so
 | 
	
		
			
				|  |  |   * that they can be easily reloaded, for example into a VM for distribution testing
 | 
	
	
		
			
				|  | @@ -291,17 +323,19 @@ subprojects { Project subProject ->
 | 
	
		
			
				|  |  |      apply plugin: 'distribution'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      final Architecture architecture = subProject.name.contains('aarch64-') ? Architecture.AARCH64 : Architecture.X64
 | 
	
		
			
				|  |  | -    // We can ignore Iron Bank at the moment as we don't
 | 
	
		
			
				|  |  | -    // build those images ourselves.
 | 
	
		
			
				|  |  | -    final DockerBase base = subProject.name.contains('ubi-') ? DockerBase.UBI : DockerBase.CENTOS
 | 
	
		
			
				|  |  | +    DockerBase base = DockerBase.CENTOS
 | 
	
		
			
				|  |  | +    if (subProject.name.contains('ubi-')) {
 | 
	
		
			
				|  |  | +      base = DockerBase.UBI
 | 
	
		
			
				|  |  | +    } else if (subProject.name.contains('ironbank-')) {
 | 
	
		
			
				|  |  | +      base = DockerBase.IRON_BANK
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      final String arch = architecture == Architecture.AARCH64 ? '-aarch64' : ''
 | 
	
		
			
				|  |  | -    final String suffix = base == DockerBase.UBI ? '-ubi8' : ''
 | 
	
		
			
				|  |  | -    final String extension = base == DockerBase.UBI ? 'ubi.tar' : 'docker.tar'
 | 
	
		
			
				|  |  | -    final String artifactName = "elasticsearch${arch}${suffix}_test"
 | 
	
		
			
				|  |  | +    final String extension = base == DockerBase.UBI ? 'ubi.tar' : (base == DockerBase.IRON_BANK ? 'ironbank.tar' : 'docker.tar')
 | 
	
		
			
				|  |  | +    final String artifactName = "elasticsearch${arch}${base.suffix}_test"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    final String exportTaskName = taskName("export", architecture, base, "DockerImage")
 | 
	
		
			
				|  |  | -    final String buildTaskName = taskName("build", architecture, base, "DockerImage")
 | 
	
		
			
				|  |  | +    final String exportTaskName = taskName("export", architecture, base, 'DockerImage')
 | 
	
		
			
				|  |  | +    final String buildTaskName = taskName('build', architecture, base, 'DockerImage')
 | 
	
		
			
				|  |  |      final String tarFile = "${parent.projectDir}/build/${artifactName}_${VersionProperties.elasticsearch}.${extension}"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      tasks.register(exportTaskName, LoggedExec) {
 | 
	
	
		
			
				|  | @@ -311,7 +345,7 @@ subprojects { Project subProject ->
 | 
	
		
			
				|  |  |        args "save",
 | 
	
		
			
				|  |  |          "-o",
 | 
	
		
			
				|  |  |          tarFile,
 | 
	
		
			
				|  |  | -        "elasticsearch${suffix}:test"
 | 
	
		
			
				|  |  | +        "elasticsearch${base.suffix}:test"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        dependsOn(parent.path + ":" + buildTaskName)
 | 
	
		
			
				|  |  |        onlyIf { Architecture.current() == architecture }
 |