Skip to content

Commit 4af4eb9

Browse files
authored
Introduce aarch64 Docker image (#53936)
This commit introduces the infrastructure needed to build a Docker image for aarch64.
1 parent cdc377e commit 4af4eb9

File tree

9 files changed

+85
-32
lines changed

9 files changed

+85
-32
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apply plugin: 'base'
2+
3+
task buildDockerBuildContext(type: Tar) {
4+
extension = 'tar.gz'
5+
compression = Compression.GZIP
6+
archiveClassifier = "docker-build-context"
7+
archiveBaseName = "elasticsearch-aarch64"
8+
with dockerBuildContext("aarch64", false, false)
9+
}
10+
11+
assemble.dependsOn buildDockerBuildContext
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// This file is intentionally blank. All configuration of the
2+
// export is done in the parent project.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
apply plugin: 'base'
2+
3+
task buildOssDockerBuildContext(type: Tar) {
4+
extension = 'tar.gz'
5+
compression = Compression.GZIP
6+
archiveClassifier = "docker-build-context"
7+
archiveBaseName = "elasticsearch-aarch64-oss"
8+
with dockerBuildContext("aarch64", true, false)
9+
}
10+
11+
assemble.dependsOn buildOssDockerBuildContext
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// This file is intentionally blank. All configuration of the
2+
// export is done in the parent project.

distribution/docker/build.gradle

+52-26
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import org.elasticsearch.gradle.Architecture
12
import org.elasticsearch.gradle.ElasticsearchDistribution.Flavor
23
import org.elasticsearch.gradle.LoggedExec
34
import org.elasticsearch.gradle.VersionProperties
@@ -13,38 +14,51 @@ testFixtures.useFixture()
1314

1415
configurations {
1516
dockerPlugins
17+
aarch64DockerSource
1618
dockerSource
19+
aarch64OssDockerSource
1720
ossDockerSource
1821
}
1922

2023
dependencies {
24+
aarch64DockerSource project(path: ":distribution:archives:linux-aarch64-tar")
2125
dockerSource project(path: ":distribution:archives:linux-tar")
26+
aarch64OssDockerSource project(path: ":distribution:archives:oss-linux-aarch64-tar")
2227
ossDockerSource project(path: ":distribution:archives:oss-linux-tar")
2328
}
2429

25-
ext.expansions = { oss, local ->
26-
final String classifier = 'linux-x86_64'
30+
ext.expansions = { architecture, oss, local ->
31+
switch (architecture) {
32+
case "aarch64":
33+
case "x64":
34+
break;
35+
default:
36+
throw new IllegalArgumentException("unrecongized architecture [" + architecture + "], must be one of (aarch64|x64)")
37+
}
38+
final String classifier = "aarch64".equals(architecture) ? "linux-aarch64" : "linux-x86_64"
2739
final String elasticsearch = oss ? "elasticsearch-oss-${VersionProperties.elasticsearch}-${classifier}.tar.gz" : "elasticsearch-${VersionProperties.elasticsearch}-${classifier}.tar.gz"
2840
return [
41+
'base_image' : "aarch64".equals(architecture) ? "arm64v8/centos:7" : "centos:7",
2942
'build_date' : BuildParams.buildDate,
3043
'elasticsearch' : elasticsearch,
3144
'git_revision' : BuildParams.gitRevision,
3245
'license' : oss ? 'Apache-2.0' : 'Elastic-License',
3346
'source_elasticsearch': local ? "COPY $elasticsearch /opt/" : "RUN cd /opt && curl --retry 8 -s -L -O https://artifacts.elastic.co/downloads/elasticsearch/${elasticsearch} && cd -",
47+
'tini_suffix' : "aarch64".equals(architecture) ? "-arm64" : "",
3448
'version' : VersionProperties.elasticsearch
3549
]
3650
}
3751

38-
private static String buildPath(final boolean oss) {
39-
return "build/${oss ? 'oss-' : ''}docker"
52+
private static String buildPath(final String architecture, final boolean oss) {
53+
return "build/${"aarch64".equals(architecture) ? 'aarch64-' : ''}${oss ? 'oss-' : ''}docker"
4054
}
4155

42-
private static String taskName(final String prefix, final boolean oss, final String suffix) {
43-
return "${prefix}${oss ? 'Oss' : ''}${suffix}"
56+
private static String taskName(final String prefix, final String architecture, final boolean oss, final String suffix) {
57+
return "${prefix}${"aarch64".equals(architecture) ? 'Aarch64' : ''}${oss ? 'Oss' : ''}${suffix}"
4458
}
4559

4660
project.ext {
47-
dockerBuildContext = { boolean oss, boolean local ->
61+
dockerBuildContext = { String architecture, boolean oss, boolean local ->
4862
copySpec {
4963
into('bin') {
5064
from project.projectDir.toPath().resolve("src/docker/bin")
@@ -62,25 +76,33 @@ project.ext {
6276
}
6377

6478
from(project.projectDir.toPath().resolve("src/docker/Dockerfile")) {
65-
expand(expansions(oss, local))
79+
expand(expansions(architecture, oss, local))
6680
}
6781
}
6882
}
6983
}
7084

71-
void addCopyDockerContextTask(final boolean oss) {
72-
task(taskName("copy", oss, "DockerContext"), type: Sync) {
73-
expansions(oss, true).findAll { it.key != 'build_date' }.each { k, v ->
85+
void addCopyDockerContextTask(final String architecture, final boolean oss) {
86+
task(taskName("copy", architecture, oss, "DockerContext"), type: Sync) {
87+
expansions(architecture, oss, true).findAll { it.key != 'build_date' }.each { k, v ->
7488
inputs.property(k, { v.toString() })
7589
}
76-
into buildPath(oss)
90+
into buildPath(architecture, oss)
7791

78-
with dockerBuildContext(oss, true)
92+
with dockerBuildContext(architecture, oss, true)
7993

80-
if (oss) {
81-
from configurations.ossDockerSource
94+
if ("aarch64".equals(architecture)) {
95+
if (oss) {
96+
from configurations.aarch64OssDockerSource
97+
} else {
98+
from configurations.aarch64DockerSource
99+
}
82100
} else {
83-
from configurations.dockerSource
101+
if (oss) {
102+
from configurations.ossDockerSource
103+
} else {
104+
from configurations.dockerSource
105+
}
84106
}
85107

86108
from configurations.dockerPlugins
@@ -149,9 +171,9 @@ task integTest(type: Test) {
149171

150172
check.dependsOn integTest
151173

152-
void addBuildDockerImage(final boolean oss) {
153-
final Task buildDockerImageTask = task(taskName("build", oss, "DockerImage"), type: DockerBuildTask) {
154-
TaskProvider<Sync> copyContextTask = tasks.named(taskName("copy", oss, "DockerContext"))
174+
void addBuildDockerImage(final String architecture, final boolean oss) {
175+
final Task buildDockerImageTask = task(taskName("build", architecture, oss, "DockerImage"), type: DockerBuildTask) {
176+
TaskProvider<Sync> copyContextTask = tasks.named(taskName("copy", architecture, oss, "DockerContext"))
155177
dependsOn(copyContextTask)
156178
dockerContext.fileProvider(copyContextTask.map { it.destinationDir })
157179

@@ -170,11 +192,14 @@ void addBuildDockerImage(final boolean oss) {
170192
}
171193
}
172194
assemble.dependsOn(buildDockerImageTask)
195+
buildDockerImageTask.enabled = Architecture.current().name().toLowerCase().equals(architecture)
173196
}
174197

175-
for (final boolean oss : [false, true]) {
176-
addCopyDockerContextTask(oss)
177-
addBuildDockerImage(oss)
198+
for (final String architecture : ["aarch64", "x64"]) {
199+
for (final boolean oss : [false, true]) {
200+
addCopyDockerContextTask(architecture, oss)
201+
addBuildDockerImage(architecture, oss)
202+
}
178203
}
179204

180205
// We build the images used in compose locally, but the pull command insists on using a repository
@@ -192,11 +217,12 @@ subprojects { Project subProject ->
192217
if (subProject.name.contains('docker-export')) {
193218
apply plugin: 'distribution'
194219

220+
final String architecture = subProject.name.contains('aarch64-') ? 'aarch64' : 'x64'
195221
final boolean oss = subProject.name.contains('oss-')
196222

197-
def exportTaskName = taskName("export", oss, "DockerImage")
198-
def buildTaskName = taskName("build", oss, "DockerImage")
199-
def tarFile = "${parent.projectDir}/build/elasticsearch${oss ? '-oss' : ''}_test.${VersionProperties.elasticsearch}.docker.tar"
223+
def exportTaskName = taskName("export", architecture, oss, "DockerImage")
224+
def buildTaskName = taskName("build", architecture, oss, "DockerImage")
225+
def tarFile = "${parent.projectDir}/build/elasticsearch${"aarch64".equals(architecture) ? '-aarch64' : ''}${oss ? '-oss' : ''}_test.${VersionProperties.elasticsearch}.docker.tar"
200226

201227
final Task exportDockerImageTask = task(exportTaskName, type: LoggedExec) {
202228
inputs.file("${parent.projectDir}/build/markers/${buildTaskName}.marker")
@@ -212,7 +238,7 @@ subprojects { Project subProject ->
212238

213239
artifacts.add('default', file(tarFile)) {
214240
type 'tar'
215-
name "elasticsearch${oss ? '-oss' : ''}"
241+
name "elasticsearch${"aarch64".equals(architecture) ? '-aarch64' : ''}${oss ? '-oss' : ''}"
216242
builtBy exportTaskName
217243
}
218244

distribution/docker/docker-build-context/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ task buildDockerBuildContext(type: Tar) {
55
compression = Compression.GZIP
66
archiveClassifier = "docker-build-context"
77
archiveBaseName = "elasticsearch"
8-
with dockerBuildContext(false, false)
8+
with dockerBuildContext("x64", false, false)
99
}
1010

1111
assemble.dependsOn buildDockerBuildContext

distribution/docker/oss-docker-build-context/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ task buildOssDockerBuildContext(type: Tar) {
55
compression = Compression.GZIP
66
archiveClassifier = "docker-build-context"
77
archiveBaseName = "elasticsearch-oss"
8-
with dockerBuildContext(true, false)
8+
with dockerBuildContext("x64", true, false)
99
}
1010

1111
assemble.dependsOn buildOssDockerBuildContext

distribution/docker/src/docker/Dockerfile

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# Set gid=0 and make group perms==owner perms
1212
################################################################################
1313

14-
FROM centos:7 AS builder
14+
FROM ${base_image} AS builder
1515

1616
RUN for iter in {1..10}; do yum update --setopt=tsflags=nodocs -y && \
1717
yum install --setopt=tsflags=nodocs -y gzip shadow-utils tar && \
@@ -42,8 +42,8 @@ RUN chmod 0660 config/elasticsearch.yml config/log4j2.properties
4242
# gpg, but the keyservers are slow to return the key and this can fail the
4343
# build. Instead, we check the binary against a checksum that we have
4444
# computed.
45-
ADD https://github.com/krallin/tini/releases/download/v0.18.0/tini /tini
46-
COPY config/tini.sha512 /tini.sha512
45+
ADD https://github.com/krallin/tini/releases/download/v0.18.0/tini${tini_suffix} /tini
46+
COPY config/tini${tini_suffix}.sha512 /tini.sha512
4747
RUN sha512sum -c /tini.sha512 && chmod +x /tini
4848

4949
################################################################################
@@ -52,7 +52,7 @@ RUN sha512sum -c /tini.sha512 && chmod +x /tini
5252
# Add entrypoint
5353
################################################################################
5454

55-
FROM centos:7
55+
FROM ${base_image}
5656

5757
ENV ELASTIC_CONTAINER true
5858

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
6ae5147e522e484b9d59b0caa04e6dadf0efe332b272039c7cf5951e39f5028e9852c3c4bcdd46b98977329108d555ee7ea55f9eca99765d05922ec7aff837d8 /tini

0 commit comments

Comments
 (0)