diff --git a/README.md b/README.md index 3adc41c..2e26549 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Gradle Docker Java Plugin [![Build](https://github.com/augi/gradle-docker-java/actions/workflows/build.yml/badge.svg)](https://github.com/augi/gradle-docker-java/actions/workflows/build.yml) [![Version](https://badgen.net/maven/v/maven-central/cz.augi/gradle-docker-java)](https://repo1.maven.org/maven2/cz/augi/gradle-docker-java/) Gradle plugin that wraps your JVM application to a new Docker image. - The image has [standard labels](http://label-schema.org/rc1/) derived from the build environment (environment variables, Git). + The image has [standard labels](http://label-schema.org/rc1/) and [OCI annotations](https://github.com/opencontainers/image-spec/blob/main/annotations.md) derived from the build environment (environment variables, Git). Almost all the logic on Dockerfile generation is in [this file](src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy). The plugin takes product of `distTar` task (added by [the application plugin](https://docs.gradle.org/current/userguide/application_plugin.html)) and wraps it to Docker image. @@ -18,14 +18,12 @@ The plugin is published to [Gradle Plugins portal](https://plugins.gradle.org/pl } dockerJava { + baseImage = 'my-org/our-base-image:1.2.3' image = "myorg/my-app:$version" // name of the resulting Docker image; mandatory alternativeImages = ["myorg/my-app:latest"] // array of alternative image names; default is empty ports = [80] // list of exposed ports; default: empty labels = ['mylabel':'mylabelvalue'] // additonal labels of Dockerfile; default: empty volumes = ['/my-folder'] // list of volumes; default: empty - baseImage = 'my-org/our-base-image:1.2.3' // default: automatically choosed the best based on current Docker platform and Java version - javaVersion = JavaVersion.VERSION_1_8 // Java version used to choose appropriate base Docker image; default: project.targetCompatibility - windowsBaseImageSpecifier = 'windowsservercore-ltsc2016' // suffix of AdoptOpenJDK Docker image that will be used as base image; another option is 'windowsservercore-1809' dockerfileLines = ['RUN apt-get ...'] // additional lines to include to Dockerfile; default: empty arguments = ['--server'] // arguments to be passed to your application; default: empty dockerBuildDirectory = project.file('my-directory') // directory where Dockerfile is created; default: "$buildDir/dockerJava" diff --git a/src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy b/src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy index 8294ba3..0529001 100644 --- a/src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy +++ b/src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy @@ -34,7 +34,7 @@ class DistDockerTask extends DefaultTask { def dockerFile = new File(workDir, 'Dockerfile') dockerFile.delete() if (dockerExecutor.getDockerPlatform().toLowerCase().contains('win')) { - dockerFile << 'FROM ' + (settings.baseImage ?: getWindowsBaseImage()) + '\n' + dockerFile << 'FROM ' + settings.baseImage + '\n' dockerFile << 'SHELL ["cmd", "/S", "/C"]\n' if (settings.ports.any()) { dockerFile << 'EXPOSE ' + settings.ports.join(' ') + '\n' @@ -47,7 +47,7 @@ class DistDockerTask extends DefaultTask { dockerFile << "WORKDIR C:\\\\bin\n" dockerFile << "ENTRYPOINT ${startScripts.windowsScript.name} ${settings.arguments.join(' ')}" } else { - dockerFile << 'FROM ' + (settings.baseImage ?: getLinuxBaseImage()) + '\n' + dockerFile << 'FROM ' + settings.baseImage + '\n' if (settings.ports.any()) { dockerFile << 'EXPOSE ' + settings.ports.join(' ') + '\n' } @@ -57,40 +57,10 @@ class DistDockerTask extends DefaultTask { dockerFile << "COPY $unpackedDistributionDir /var/app\n" dockerFile << "COPY $applicationJarFilename /var/app/lib\n" dockerFile << "WORKDIR /var/app/bin\n" - if (!settings.baseImage && settings.javaVersion == JavaVersion.VERSION_1_8) { - dockerFile << 'ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap $JAVA_OPTS"\n' - } dockerFile << "ENTRYPOINT [\"./${startScripts.unixScript.name}\"${settings.arguments.collect { ",\"$it\"" }.join('')}]" } } - private String getWindowsBaseImage() { - getAdoptOpenJdkBaseImageNamePrefix() + (settings.windowsBaseImageSpecifier ? ('-' + settings.windowsBaseImageSpecifier) : '') - } - - private String getLinuxBaseImage() { - getAdoptOpenJdkBaseImageNamePrefix() - } - - private String getAdoptOpenJdkBaseImageNamePrefix() { - switch (settings.javaVersion) { - case JavaVersion.VERSION_1_8: - return 'adoptopenjdk:8u272-b10-jre-hotspot' - case JavaVersion.VERSION_1_9: - case JavaVersion.VERSION_1_10: - case JavaVersion.VERSION_11: - return 'adoptopenjdk:11.0.9_11-jre-hotspot' - case JavaVersion.VERSION_12: - case JavaVersion.VERSION_13: - case JavaVersion.VERSION_14: - return 'adoptopenjdk:14.0.2_12-jre-hotspot' - case JavaVersion.VERSION_15: - return 'adoptopenjdk:15.0.1_9-jre-hotspot' - default: - throw new RuntimeException("Java version ${settings.javaVersion} is not supported") - } - } - private Map<String, String> getLabels() { def url = getUrl() def vcsUrl = getVcsUrl() @@ -198,11 +168,7 @@ interface DistDockerSettings { String getImage() @Input @Optional String[] getAlternativeImages() - @Input @Optional - JavaVersion getJavaVersion() - @Input @Optional - String getWindowsBaseImageSpecifier() - @Input @Optional + @Input String getBaseImage() @Input @Optional Integer[] getPorts() diff --git a/src/main/groovy/cz/augi/gradle/dockerjava/DockerExecutor.groovy b/src/main/groovy/cz/augi/gradle/dockerjava/DockerExecutor.groovy index 0318223..b706578 100644 --- a/src/main/groovy/cz/augi/gradle/dockerjava/DockerExecutor.groovy +++ b/src/main/groovy/cz/augi/gradle/dockerjava/DockerExecutor.groovy @@ -4,7 +4,7 @@ import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.platform.base.Platform import org.gradle.process.ExecSpec -import org.gradle.util.VersionNumber +import org.gradle.util.internal.VersionNumber class DockerExecutor { private final Project project diff --git a/src/main/groovy/cz/augi/gradle/dockerjava/DockerJavaExtension.groovy b/src/main/groovy/cz/augi/gradle/dockerjava/DockerJavaExtension.groovy index 46fb926..759f019 100644 --- a/src/main/groovy/cz/augi/gradle/dockerjava/DockerJavaExtension.groovy +++ b/src/main/groovy/cz/augi/gradle/dockerjava/DockerJavaExtension.groovy @@ -15,10 +15,6 @@ class DockerJavaExtension implements DistDockerSettings, DockerPushSettings { String image String[] alternativeImages = [] - JavaVersion getJavaVersion() { customJavaVersion ?: project.targetCompatibility } - void setJavaVersion(JavaVersion version) { customJavaVersion = version } - private JavaVersion customJavaVersion - String windowsBaseImageSpecifier = 'windowsservercore-ltsc2016' String baseImage Integer[] ports = [] String[] volumes = [] diff --git a/src/test/groovy/cz/augi/gradle/dockerjava/DockerExecutorTest.groovy b/src/test/groovy/cz/augi/gradle/dockerjava/DockerExecutorTest.groovy index 1137f6a..0829f65 100644 --- a/src/test/groovy/cz/augi/gradle/dockerjava/DockerExecutorTest.groovy +++ b/src/test/groovy/cz/augi/gradle/dockerjava/DockerExecutorTest.groovy @@ -1,7 +1,7 @@ package cz.augi.gradle.dockerjava import org.gradle.testfixtures.ProjectBuilder -import org.gradle.util.VersionNumber +import org.gradle.util.internal.VersionNumber import spock.lang.Specification class DockerExecutorTest extends Specification { diff --git a/src/test/groovy/cz/augi/gradle/dockerjava/DockerJavaPluginTest.groovy b/src/test/groovy/cz/augi/gradle/dockerjava/DockerJavaPluginTest.groovy index a9fcb22..bf19d89 100644 --- a/src/test/groovy/cz/augi/gradle/dockerjava/DockerJavaPluginTest.groovy +++ b/src/test/groovy/cz/augi/gradle/dockerjava/DockerJavaPluginTest.groovy @@ -31,6 +31,7 @@ class DockerJavaPluginTest extends Specification { } mainClassName = 'cz.augi.gradle.dockerjava.TestApp' dockerJava { + baseImage = 'adoptopenjdk:8u272-b10-jre-hotspot' image = "test/my-app:$version" ports = [80, 8080] volumes = ['/test-volume']