diff --git a/docker-plugin/src/main/java/io/micronaut/gradle/docker/DockerExtension.java b/docker-plugin/src/main/java/io/micronaut/gradle/docker/DockerExtension.java new file mode 100644 index 00000000..1dc00440 --- /dev/null +++ b/docker-plugin/src/main/java/io/micronaut/gradle/docker/DockerExtension.java @@ -0,0 +1,22 @@ +/* + * Copyright 2003-2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micronaut.gradle.docker; + +import org.gradle.api.provider.Property; + +public interface DockerExtension { + Property getUseCopyLink(); +} diff --git a/docker-plugin/src/main/java/io/micronaut/gradle/docker/MicronautDockerPlugin.java b/docker-plugin/src/main/java/io/micronaut/gradle/docker/MicronautDockerPlugin.java index 8deb2a0c..4f63f40e 100644 --- a/docker-plugin/src/main/java/io/micronaut/gradle/docker/MicronautDockerPlugin.java +++ b/docker-plugin/src/main/java/io/micronaut/gradle/docker/MicronautDockerPlugin.java @@ -60,6 +60,8 @@ public void apply(Project project) { TaskContainer tasks = project.getTasks(); ExtensionContainer extensions = project.getExtensions(); MicronautExtension micronautExtension = extensions.getByType(MicronautExtension.class); + var dockerExtension = micronautExtension.getExtensions().create("docker", DockerExtension.class); + configureCopyLink(dockerExtension, project); NamedDomainObjectContainer dockerImages = project.getObjects().domainObjectContainer(MicronautDockerImage.class, s -> project.getObjects().newInstance(DefaultMicronautDockerImage.class, s)); micronautExtension.getExtensions().add("dockerImages", dockerImages); dockerImages.all(image -> createDockerImage(project, image)); @@ -78,6 +80,13 @@ public void apply(Project project) { }); } + private void configureCopyLink(DockerExtension dockerExtension, Project project) { + var useCopyLink = dockerExtension.getUseCopyLink(); + useCopyLink.convention(true); + project.getTasks().withType(MicronautDockerfile.class).configureEach(t -> t.getUseCopyLink().convention(useCopyLink)); + project.getTasks().withType(NativeImageDockerfile.class).configureEach(t -> t.getUseCopyLink().convention(useCopyLink)); + } + public static void createDependencyLayers(MicronautDockerImage image, Configuration configuration) { var projectLibs = configuration.getIncoming() .artifactView(view -> { diff --git a/docker-plugin/src/test/groovy/io/micronaut/gradle/DockerBuildTaskSpec.groovy b/docker-plugin/src/test/groovy/io/micronaut/gradle/DockerBuildTaskSpec.groovy index 78d1b525..9c809996 100644 --- a/docker-plugin/src/test/groovy/io/micronaut/gradle/DockerBuildTaskSpec.groovy +++ b/docker-plugin/src/test/groovy/io/micronaut/gradle/DockerBuildTaskSpec.groovy @@ -418,6 +418,42 @@ class Application { } + @Issue("https://github.com/micronaut-projects/micronaut-gradle-plugin/issues/971") + def "can disable COPY --link"() { + given: + settingsFile << "rootProject.name = 'hello-world'" + buildFile << """ + plugins { + id "io.micronaut.minimal.application" + id "io.micronaut.docker" + } + + micronaut { + version "$micronautVersion" + docker.useCopyLink = $useCopyLink + } + + $repositoriesBlock + + mainClassName="example.Application" + + """ + + when: + def result = build('dockerfile', '-s') + + def task = result.task(":dockerfile") + def dockerFile = file("build/docker/main/Dockerfile").text + + then: + task.outcome == TaskOutcome.SUCCESS + dockerFile.contains("COPY --link layers/libs /home/app/libs") == useCopyLink + dockerFile.contains("COPY layers/libs /home/app/libs") == !useCopyLink + + where: + useCopyLink << [false, true] + } + private static String getSnapshotMetadata() { DockerBuildTaskSpec.getResourceAsStream("/dummy-metadata.xml").text }