Skip to content

Commit

Permalink
the image contains two layers - one with dependencies, and one with a…
Browse files Browse the repository at this point in the history
…pplication JAR only
  • Loading branch information
augi committed Feb 14, 2020
1 parent 7f08175 commit 792374c
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 12 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Gradle plugin that wraps your JVM application to a new Docker image.
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.
It copies files in two steps - first, it copies all files except the application JAR. And finally, it copies the application JAR. So if you change just application code, the layer with dependencies remains the same.


Usage
Expand Down
31 changes: 19 additions & 12 deletions src/main/groovy/cz/augi/gradle/dockerjava/DistDockerTask.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.gradle.api.tasks.application.CreateStartScripts

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
import java.time.Clock

Expand All @@ -27,7 +28,7 @@ class DistDockerTask extends DefaultTask {
@Nested
DistDockerSettings settings

def createDockerfile(File workDir, String tarFileName, String tarRootDirectory, CreateStartScripts startScripts) {
def createDockerfile(File workDir, String unpackedDistributionDir, String applicationJarFilename, CreateStartScripts startScripts) {
def dockerFile = new File(workDir, 'Dockerfile')
dockerFile.delete()
if (dockerExecutor.getDockerPlatform().toLowerCase().contains('win')) {
Expand All @@ -39,8 +40,9 @@ class DistDockerTask extends DefaultTask {
settings.volumes.each { dockerFile << "VOLUME $it\n" }
dockerFile << 'LABEL ' + getLabels().collect { "\"${it.key}\"=\"${it.value}\"" }.join(' ') + '\n'
settings.dockerfileLines.each { dockerFile << it + '\n' }
dockerFile << "ADD $tarFileName C:\n"
dockerFile << "WORKDIR C:\\\\$tarRootDirectory\\\\bin\n"
dockerFile << "COPY $unpackedDistributionDir C:\n"
dockerFile << "COPY $applicationJarFilename C:\\\\lib\n"
dockerFile << "WORKDIR C:\\\\bin\n"
dockerFile << "ENTRYPOINT ${startScripts.windowsScript.name} ${settings.arguments.join(' ')}"
} else {
dockerFile << 'FROM ' + (settings.baseImage ?: getLinuxBaseImage()) + '\n'
Expand All @@ -50,8 +52,9 @@ class DistDockerTask extends DefaultTask {
settings.volumes.each { dockerFile << "VOLUME $it\n" }
dockerFile << 'LABEL ' + getLabels().collect { "\"${it.key}\"=\"${it.value}\"" }.join(' ') + '\n'
settings.dockerfileLines.each { dockerFile << it + '\n' }
dockerFile << "ADD $tarFileName /var\n"
dockerFile << "WORKDIR /var/$tarRootDirectory/bin\n"
dockerFile << "COPY $unpackedDistributionDir /var/app\n"
dockerFile << "COPY $applicationJarFilename /var/app/lib\n"
dockerFile << "WORKDIR /var/app/bin\n"
if (settings.javaVersion == JavaVersion.VERSION_1_8) {
dockerFile << 'ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap $JAVA_OPTS"\n'
}
Expand Down Expand Up @@ -152,15 +155,19 @@ class DistDockerTask extends DefaultTask {
args.add(workDir.toFile().absolutePath)
dockerExecutor.execute(*args)
} else {
def tarFile = new File(workDir.toFile(), 'dist.tar')

File sourceTar = settings.project.tasks.distTar.archivePath
Files.copy(sourceTar.toPath(), tarFile.toPath(), StandardCopyOption.REPLACE_EXISTING)

File sourceTar = project.tasks.distTar.archivePath
String tarRootDirectory = sourceTar.name.substring(0, sourceTar.name.lastIndexOf('.'))
CreateStartScripts startScripts = project.tasks.startScripts
createDockerfile(workDir.toFile(), tarFile.name, tarRootDirectory, startScripts)
project.copy {
it.from(project.tarTree(sourceTar))
it.into workDir
}
String applicationJarFilename = project.tasks.jar.archiveFileName.get()
Path applicationJarSourcePath = Paths.get(workDir.toAbsolutePath().toString(), tarRootDirectory, 'lib', applicationJarFilename)
Path applicationJarTargetPath = Paths.get(workDir.toAbsolutePath().toString(), applicationJarFilename)
Files.move(applicationJarSourcePath, applicationJarTargetPath, StandardCopyOption.REPLACE_EXISTING)

CreateStartScripts startScripts = project.tasks.startScripts
createDockerfile(workDir.toFile(), tarRootDirectory, applicationJarFilename, startScripts)
def args = ['build', '-t', settings.image]
settings.alternativeImages.each { args.addAll(['-t', it]) }
args.add(workDir.toFile().absolutePath)
Expand Down

0 comments on commit 792374c

Please sign in to comment.