-
Notifications
You must be signed in to change notification settings - Fork 25.6k
Introduce Docker images build #36246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
39c2372
a12dc3c
b7d2f08
efad7cb
a9c9166
f8364d3
d50a5ce
8e78667
684fcb5
26fe606
e065cd8
6419019
0c2e6ff
b20be22
859a87f
ed4bf10
507eaec
cc31ddd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| import org.elasticsearch.gradle.BuildPlugin | ||
| import org.elasticsearch.gradle.LoggedExec | ||
| import org.elasticsearch.gradle.MavenFilteringHack | ||
| import org.elasticsearch.gradle.VersionProperties | ||
|
|
||
| apply plugin: 'base' | ||
|
|
||
| configurations { | ||
| dockerPlugins | ||
| dockerSource | ||
| ossDockerSource | ||
| } | ||
|
|
||
| dependencies { | ||
| dockerPlugins project(path: ":plugins:ingest-geoip", configuration: 'zip') | ||
| dockerPlugins project(path: ":plugins:ingest-user-agent", configuration: 'zip') | ||
| dockerSource project(path: ":distribution:archives:tar") | ||
| ossDockerSource project(path: ":distribution:archives:oss-tar") | ||
| } | ||
|
|
||
| ext.expansions = { oss -> | ||
| return [ | ||
| 'elasticsearch' : oss ? "elasticsearch-oss-${VersionProperties.elasticsearch}.tar.gz" : "elasticsearch-${VersionProperties.elasticsearch}.tar.gz", | ||
| 'jdkUrl' : 'https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz', | ||
| 'jdkVersion' : '11.0.1', | ||
| 'license': oss ? 'Apache-2.0' : 'Elastic License', | ||
| 'ingest-geoip' : "ingest-geoip-${VersionProperties.elasticsearch}.zip", | ||
| 'ingest-user-agent' : "ingest-user-agent-${VersionProperties.elasticsearch}.zip", | ||
| 'version' : VersionProperties.elasticsearch | ||
| ] | ||
| } | ||
|
|
||
| private static String files(final boolean oss) { | ||
| return "build/${ oss ? 'oss-' : ''}docker" | ||
| } | ||
|
|
||
| private static String taskName(final String prefix, final boolean oss, final String suffix) { | ||
| return "${prefix}${oss ? 'Oss' : ''}${suffix}" | ||
| } | ||
|
|
||
| void addCopyDockerContextTask(final boolean oss) { | ||
| task(taskName("copy", oss, "DockerContext"), type: Sync) { | ||
| into files(oss) | ||
|
|
||
| into('bin') { | ||
| from 'src/docker/bin' | ||
| } | ||
|
|
||
| into('config') { | ||
| from 'src/docker/config' | ||
| } | ||
|
|
||
| if (oss) { | ||
| from configurations.ossDockerSource | ||
| } else { | ||
| from configurations.dockerSource | ||
| } | ||
|
|
||
| from configurations.dockerPlugins | ||
| } | ||
| } | ||
|
|
||
| void addCopyDockerfileTask(final boolean oss) { | ||
| task(taskName("copy", oss, "Dockerfile"), type: Copy) { | ||
| mustRunAfter(taskName("copy", oss, "DockerContext")) | ||
| into files(oss) | ||
|
|
||
| from('src/docker/Dockerfile') { | ||
| MavenFilteringHack.filter(it, expansions(oss)) | ||
| } | ||
| } | ||
| } | ||
|
|
||
| void addBuildDockerImage(final boolean oss) { | ||
| final Task buildDockerImageTask = task(taskName("build", oss, "DockerImage"), type: LoggedExec) { | ||
| dependsOn taskName("copy", oss, "DockerContext") | ||
| dependsOn taskName("copy", oss, "Dockerfile") | ||
| List<String> tags | ||
| if (oss) { | ||
| tags = [ "docker.elastic.co/elasticsearch/elasticsearch-oss:${VersionProperties.elasticsearch}" ] | ||
| } else { | ||
| tags = [ | ||
| "elasticsearch:${VersionProperties.elasticsearch}", | ||
| "docker.elastic.co/elasticsearch/elasticsearch:${VersionProperties.elasticsearch}", | ||
| "docker.elastic.co/elasticsearch/elasticsearch-full:${VersionProperties.elasticsearch}" | ||
| ] | ||
| } | ||
| executable 'docker' | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This means that we'll need docker installed even for
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @atorok I pushed one more change, to check if we can even run Docker: 26fe606 This gives output like:
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That seems right. We talked about making a parameter that let you explicitly skip the tasks which would be a nice thing to have. Something like
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this would be an ideal time to consider using img or Buildah as the build executor instead of the Docker daemon. I personally consider this to be the "next step" in improving the build, and it just seems like a great time to redefine the dependencies. Getting away from the Docker daemon not only improves the local build experience for developers, especially if they don't run Linux on their workstations, it also makes a much better story for running builds in container environments, like the work that @mgreau is actively pursuing.
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you for the suggestion. Alas the Docker daemon will stay around since we are migrating some of our testing away from Vagrant fixtures to Docker Compose fixtures. That’s not to say we won’t take your suggestion up. |
||
| final List<String> dockerArgs = ['build', files(oss), '--pull'] | ||
| for (final String tag : tags) { | ||
| dockerArgs.add('--tag') | ||
| dockerArgs.add(tag) | ||
| } | ||
| args dockerArgs.toArray() | ||
| } | ||
| BuildPlugin.requireDocker(buildDockerImageTask) | ||
| } | ||
|
|
||
| for (final boolean oss : [false, true]) { | ||
| addCopyDockerContextTask(oss) | ||
| addCopyDockerfileTask(oss) | ||
| addBuildDockerImage(oss) | ||
| } | ||
|
|
||
| assemble.dependsOn "buildOssDockerImage" | ||
| assemble.dependsOn "buildDockerImage" | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| ################################################################################ | ||
| # This Dockerfile was generated from the template at distribution/src/docker/Dockerfile | ||
| # | ||
| # Beginning of multi stage Dockerfile | ||
| ################################################################################ | ||
|
|
||
| ################################################################################ | ||
| # Build stage 0 `builder`: | ||
| # Extract elasticsearch artifact | ||
| # Install required plugins | ||
| # Set gid=0 and make group perms==owner perms | ||
| ################################################################################ | ||
|
|
||
| FROM centos:7 AS builder | ||
|
|
||
| ENV PATH /usr/share/elasticsearch/bin:$PATH | ||
| ENV JAVA_HOME /opt/jdk-${jdkVersion} | ||
|
|
||
| RUN curl -s ${jdkUrl} | tar -C /opt -zxf - | ||
|
|
||
| # Replace OpenJDK's built-in CA certificate keystore with the one from the OS | ||
| # vendor. The latter is superior in several ways. | ||
| # REF: https://github.com/elastic/elasticsearch-docker/issues/171 | ||
| RUN ln -sf /etc/pki/ca-trust/extracted/java/cacerts /opt/jdk-${jdkVersion}/lib/security/cacerts | ||
|
|
||
| RUN yum install -y unzip which | ||
|
|
||
| RUN groupadd -g 1000 elasticsearch && \ | ||
| adduser -u 1000 -g 1000 -d /usr/share/elasticsearch elasticsearch | ||
|
|
||
| WORKDIR /usr/share/elasticsearch | ||
|
|
||
| COPY ${elasticsearch} ${ingest-geoip} ${ingest-user-agent} /opt/ | ||
| RUN tar zxf /opt/${elasticsearch} --strip-components=1 | ||
| RUN elasticsearch-plugin install --batch file:///opt/${ingest-geoip} | ||
| RUN elasticsearch-plugin install --batch file:///opt/${ingest-user-agent} | ||
| RUN mkdir -p config data logs | ||
| RUN chmod 0775 config data logs | ||
| COPY config/elasticsearch.yml config/log4j2.properties config/ | ||
|
|
||
|
|
||
| ################################################################################ | ||
| # Build stage 1 (the actual elasticsearch image): | ||
| # Copy elasticsearch from stage 0 | ||
| # Add entrypoint | ||
| ################################################################################ | ||
|
|
||
| FROM centos:7 | ||
|
|
||
| ENV ELASTIC_CONTAINER true | ||
| ENV JAVA_HOME /opt/jdk-${jdkVersion} | ||
|
|
||
| COPY --from=builder /opt/jdk-${jdkVersion} /opt/jdk-${jdkVersion} | ||
|
|
||
| RUN yum update -y && \ | ||
| yum install -y nc unzip wget which && \ | ||
| yum clean all | ||
|
|
||
| RUN groupadd -g 1000 elasticsearch && \ | ||
| adduser -u 1000 -g 1000 -G 0 -d /usr/share/elasticsearch elasticsearch && \ | ||
| chmod 0775 /usr/share/elasticsearch && \ | ||
| chgrp 0 /usr/share/elasticsearch | ||
|
|
||
| WORKDIR /usr/share/elasticsearch | ||
| COPY --from=builder --chown=1000:0 /usr/share/elasticsearch /usr/share/elasticsearch | ||
| ENV PATH /usr/share/elasticsearch/bin:$PATH | ||
|
|
||
| COPY --chown=1000:0 bin/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh | ||
|
|
||
| # Openshift overrides USER and uses ones with randomly uid>1024 and gid=0 | ||
| # Allow ENTRYPOINT (and ES) to run even with a different user | ||
| RUN chgrp 0 /usr/local/bin/docker-entrypoint.sh && \ | ||
| chmod g=u /etc/passwd && \ | ||
| chmod 0775 /usr/local/bin/docker-entrypoint.sh | ||
|
|
||
| EXPOSE 9200 9300 | ||
|
|
||
| LABEL org.label-schema.schema-version="1.0" \ | ||
| org.label-schema.vendor="Elastic" \ | ||
| org.label-schema.name="elasticsearch" \ | ||
| org.label-schema.version="${version}" \ | ||
| org.label-schema.url="https://www.elastic.co/products/elasticsearch" \ | ||
| org.label-schema.vcs-url="https://github.com/elastic/elasticsearch" \ | ||
| license="${license}" | ||
|
|
||
| ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] | ||
| # Dummy overridable parameter parsed by entrypoint | ||
| CMD ["eswrapper"] | ||
|
|
||
| ################################################################################ | ||
| # End of multi-stage Dockerfile | ||
| ################################################################################ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Instead of using an essentially global property like this, can we have a property on the tasks using docker themselves? Then we can use a
.allclosure on the tasks container looking for the property, and check for docker in the middle of configuration instead of waiting until all projects are configured. There would still be a rootProject property to "remember" docker was already checked, but the tasks won't (directly) modify the root project.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 on marking the task, but I would make it a custom task and use
tasks.withType.The checks could live in the same class as static methods.
We could at some time introduce an interface and have a generic "this task requires something that we need to check up-front" mechanism, we already have others: docker-compose, jdk versions tasks (tests) that require specific inputs to run.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think these are very good suggestions but I’m going to ask one of you to pick this up on a follow-up please?