Allow image application directory to be configurable
An `applicationDirectory` option on the Maven `spring-boot:build-image` goal and the Gradle `bootBuildImage` task can be configured to set the location that will be used to upload application contents to the builder image, and will contain the application contents in the generated image. Closes gh-34786
This commit is contained in:
@@ -209,6 +209,13 @@ The values provided to the `tags` option should be full image references in the
|
||||
The value must be a string in the ISO 8601 instant format, or `now` to use the current date and time.
|
||||
| A fixed date that enables https://buildpacks.io/docs/features/reproducibility/[build reproducibility].
|
||||
|
||||
|
||||
| `applicationDirectory` +
|
||||
(`spring-boot.build-image.applicationDirectory`)
|
||||
| The path to a directory that application contents will be uploaded to in the builder image.
|
||||
Application contents will also be in this location in the generated image.
|
||||
| `/workspace`
|
||||
|
||||
|===
|
||||
|
||||
NOTE: The plugin detects the target Java compatibility of the project using the compiler's plugin configuration or the `maven.compiler.target` property.
|
||||
|
||||
@@ -245,6 +245,7 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
||||
"projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.2")
|
||||
.systemProperty("spring-boot.build-image.runImage", "projects.registry.vmware.com/springboot/run:tiny-cnb")
|
||||
.systemProperty("spring-boot.build-image.createdDate", "2020-07-01T12:34:56Z")
|
||||
.systemProperty("spring-boot.build-image.applicationDirectory", "/application")
|
||||
.execute((project) -> {
|
||||
assertThat(buildLog(project)).contains("Building image")
|
||||
.contains("example.com/test/cmd-property-name:v1")
|
||||
@@ -434,6 +435,21 @@ class BuildImageTests extends AbstractArchiveIntegrationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void whenBuildImageIsInvokedWithApplicationDirectory(MavenBuild mavenBuild) {
|
||||
String testBuildId = randomString();
|
||||
mavenBuild.project("build-image-app-dir")
|
||||
.goals("package")
|
||||
.systemProperty("spring-boot.build-image.pullPolicy", "IF_NOT_PRESENT")
|
||||
.systemProperty("test-build-id", testBuildId)
|
||||
.execute((project) -> {
|
||||
assertThat(buildLog(project)).contains("Building image")
|
||||
.contains("docker.io/library/build-image-app-dir:0.0.1.BUILD-SNAPSHOT")
|
||||
.contains("Successfully built image");
|
||||
removeImage("build-image-app-dir", "0.0.1.BUILD-SNAPSHOT");
|
||||
});
|
||||
}
|
||||
|
||||
@TestTemplate
|
||||
void failsWhenBuildImageIsInvokedOnMultiModuleProjectWithBuildImageGoal(MavenBuild mavenBuild) {
|
||||
mavenBuild.project("build-image-multi-module")
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.springframework.boot.maven.it</groupId>
|
||||
<artifactId>build-image-app-dir</artifactId>
|
||||
<version>0.0.1.BUILD-SNAPSHOT</version>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>@java.version@</maven.compiler.source>
|
||||
<maven.compiler.target>@java.version@</maven.compiler.target>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>@project.groupId@</groupId>
|
||||
<artifactId>@project.artifactId@</artifactId>
|
||||
<version>@project.version@</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>build-image-no-fork</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<image>
|
||||
<builder>projects.registry.vmware.com/springboot/spring-boot-cnb-builder:0.0.2</builder>
|
||||
<applicationDirectory>/application</applicationDirectory>
|
||||
</image>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright 2012-2023 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 org.test;
|
||||
|
||||
public class SampleApplication {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.out.println("Launched");
|
||||
synchronized(args) {
|
||||
args.wait(); // Prevent exit"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -163,6 +163,14 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
|
||||
@Parameter(property = "spring-boot.build-image.createdDate", readonly = true)
|
||||
String createdDate;
|
||||
|
||||
/**
|
||||
* Alias for {@link Image#applicationDirectory} to support configuration through
|
||||
* command-line property.
|
||||
* @since 3.1.0
|
||||
*/
|
||||
@Parameter(property = "spring-boot.build-image.applicationDirectory", readonly = true)
|
||||
String applicationDirectory;
|
||||
|
||||
/**
|
||||
* Docker configuration options.
|
||||
* @since 2.4.0
|
||||
@@ -264,6 +272,9 @@ public abstract class BuildImageMojo extends AbstractPackagerMojo {
|
||||
if (image.createdDate == null && this.createdDate != null) {
|
||||
image.setCreatedDate(this.createdDate);
|
||||
}
|
||||
if (image.applicationDirectory == null && this.applicationDirectory != null) {
|
||||
image.setApplicationDirectory(this.applicationDirectory);
|
||||
}
|
||||
return customize(image.getBuildRequest(this.project.getArtifact(), content));
|
||||
}
|
||||
|
||||
|
||||
@@ -75,6 +75,8 @@ public class Image {
|
||||
|
||||
String createdDate;
|
||||
|
||||
String applicationDirectory;
|
||||
|
||||
/**
|
||||
* The name of the created image.
|
||||
* @return the image name
|
||||
@@ -187,6 +189,18 @@ public class Image {
|
||||
this.createdDate = createdDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the application content directory for the image.
|
||||
* @return the application directory
|
||||
*/
|
||||
public String getApplicationDirectory() {
|
||||
return this.applicationDirectory;
|
||||
}
|
||||
|
||||
public void setApplicationDirectory(String applicationDirectory) {
|
||||
this.applicationDirectory = applicationDirectory;
|
||||
}
|
||||
|
||||
BuildRequest getBuildRequest(Artifact artifact, Function<Owner, TarArchive> applicationContent) {
|
||||
return customize(BuildRequest.of(getOrDeduceName(artifact), applicationContent));
|
||||
}
|
||||
@@ -238,6 +252,9 @@ public class Image {
|
||||
if (StringUtils.hasText(this.createdDate)) {
|
||||
request = request.withCreatedDate(this.createdDate);
|
||||
}
|
||||
if (StringUtils.hasText(this.applicationDirectory)) {
|
||||
request = request.withApplicationDirectory(this.applicationDirectory);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
|
||||
@@ -193,6 +193,14 @@ class ImageTests {
|
||||
assertThat(request.getCreatedDate()).isEqualTo("2020-07-01T12:34:56Z");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getBuildRequestWhenHasApplicationDirectoryUsesApplicationDirectory() {
|
||||
Image image = new Image();
|
||||
image.applicationDirectory = "/application";
|
||||
BuildRequest request = image.getBuildRequest(createArtifact(), mockApplicationContent());
|
||||
assertThat(request.getApplicationDirectory()).isEqualTo("/application");
|
||||
}
|
||||
|
||||
private Artifact createArtifact() {
|
||||
return new DefaultArtifact("com.example", "my-app", VersionRange.createFromVersion("0.0.1-SNAPSHOT"), "compile",
|
||||
"jar", null, new DefaultArtifactHandler());
|
||||
|
||||
Reference in New Issue
Block a user