2020-01-23 23:35:45 +08:00
[[build-image]]
2020-04-07 09:24:26 +08:00
== Packaging OCI Images
2020-10-09 06:02:17 +08:00
The plugin can create an https://github.com/opencontainers/image-spec[OCI image] using https://buildpacks.io/[Cloud Native Buildpacks] (CNB).
2020-04-01 02:37:55 +08:00
Images can be built using the `build-image` goal.
2020-01-23 23:35:45 +08:00
2020-10-09 06:02:17 +08:00
NOTE: For security reasons, images build and run as non-root users.
See the {buildpacks-reference}/reference/spec/platform-api/#users[CNB specification] for more details.
2020-09-07 18:41:51 +08:00
2020-02-19 10:16:46 +08:00
The easiest way to get started is to invoke `mvn spring-boot:build-image` on a project.
2020-01-23 23:35:45 +08:00
It is possible to automate the creation of an image whenever the `package` phase is invoked, as shown in the following example:
[source,xml,indent=0,subs="verbatim,attributes"]
----
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
2020-01-31 07:54:15 +08:00
<version>{gradle-project-version}</version>
2020-01-23 23:35:45 +08:00
<executions>
<execution>
<goals>
<goal>build-image</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
----
TIP: While the buildpack runs from an <<repackage,executable archive>>, it is not necessary to execute the `repackage` goal first as the executable archive is created automatically if necessary.
When the `build-image` repackages the application, it applies the same settings as the `repackage` goal would, i.e. dependencies can be excluded using one of the exclude options, and Devtools is automatically excluded by default (you can control that using the `excludeDevtools` property).
2020-01-31 09:02:47 +08:00
2020-04-01 13:51:16 +08:00
2020-04-01 02:37:55 +08:00
[[build-image-docker-daemon]]
2020-04-07 09:24:26 +08:00
=== Docker Daemon
2020-04-01 02:37:55 +08:00
The `build-image` goal requires access to a Docker daemon.
By default, it will communicate with a Docker daemon over a local connection.
This works with https://docs.docker.com/install/[Docker Engine] on all supported platforms without configuration.
Environment variables can be set to configure the `build-image` goal to use the https://minikube.sigs.k8s.io/docs/tasks/docker_daemon/[Docker daemon provided by minikube].
The following table shows the environment variables and their values:
|===
| Environment variable | Description
2020-06-12 05:20:39 +08:00
| DOCKER_HOST
2020-04-01 13:51:16 +08:00
| URL containing the host and port for the Docker daemon - e.g. `tcp://192.168.99.100:2376`
2020-06-12 05:20:39 +08:00
| DOCKER_TLS_VERIFY
2020-04-01 13:51:16 +08:00
| Enable secure HTTPS protocol when set to `1` (optional)
2020-06-12 05:20:39 +08:00
| DOCKER_CERT_PATH
2020-04-01 13:51:16 +08:00
| Path to certificate and key files for HTTPS (required if `DOCKER_TLS_VERIFY=1`, ignored otherwise)
2020-04-01 02:37:55 +08:00
|===
On Linux and macOS, these environment variables can be set using the command `eval $(minikube docker-env)` after minikube has been started.
2020-01-31 09:02:47 +08:00
2020-04-01 13:51:16 +08:00
2020-01-28 03:56:42 +08:00
[[build-image-customization]]
2020-04-07 09:24:26 +08:00
=== Image Customizations
2020-01-31 07:54:15 +08:00
The plugin invokes a {buildpacks-reference}/concepts/components/builder/[builder] to orchestrate the generation of an image.
The builder includes multiple {buildpacks-reference}/concepts/components/buildpack[buildpacks] that can inspect the application to influence the generated image.
By default, the plugin chooses a builder image.
The name of the generated image is deduced from project properties.
2020-06-12 05:20:39 +08:00
The `image` parameter allows configuration of the builder and how it should operate on the project.
2020-03-18 07:40:37 +08:00
The following table summarizes the available parameters and their default values:
2020-01-28 03:56:42 +08:00
|===
2020-03-18 07:40:37 +08:00
| Parameter | Description | User property | Default value
2020-01-28 03:56:42 +08:00
| `builder`
2020-01-31 07:54:15 +08:00
| Name of the Builder image to use.
2020-03-18 07:40:37 +08:00
| `spring-boot.build-image.builder`
2020-04-30 03:05:05 +08:00
| `gcr.io/paketo-buildpacks/builder:base-platform-api-0.3`
2020-01-28 03:56:42 +08:00
2020-06-12 05:20:39 +08:00
| `runImage`
| Name of the run image to use.
| `spring-boot.build-image.runImage`
| No default value, indicating the run image specified in Builder metadata should be used.
2020-01-28 03:56:42 +08:00
| `name`
2020-01-31 07:54:15 +08:00
| {spring-boot-api}/buildpack/platform/docker/type/ImageReference.html#of-java.lang.String-[Image name] for the generated image.
2020-03-18 07:40:37 +08:00
| `spring-boot.build-image.imageName`
2020-01-28 03:56:42 +08:00
| `docker.io/library/${project.artifactId}:${project.version}`
| `env`
2020-01-31 07:54:15 +08:00
| Environment variables that should be passed to the builder.
2020-01-28 03:56:42 +08:00
|
2020-03-18 07:40:37 +08:00
|
2020-01-28 03:56:42 +08:00
| `cleanCache`
| Whether to clean the cache before building.
2020-03-18 07:40:37 +08:00
|
2020-01-28 03:56:42 +08:00
| `false`
| `verboseLogging`
2020-01-31 07:54:15 +08:00
| Enables verbose logging of builder operations.
2020-03-18 07:40:37 +08:00
|
2020-01-28 03:56:42 +08:00
| `false`
|===
2020-08-31 22:15:30 +08:00
NOTE: The plugin detects the target Java compatibility of the project using the compiler's plugin configuration or the `maven.compiler.target` property.
2020-10-09 06:02:17 +08:00
When using the default Paketo builder and buildpacks, the plugin instructs the buildpacks to install the same Java version.
You can override this behaviour as shown in the <<build-image-example-builder-configuration,builder configuration>> examples.
2020-08-31 22:15:30 +08:00
For more details, see also <<build-image-example-custom-image-builder,custom image builder>> and <<build-image-example-custom-image-name,custom image name>>.
2020-01-23 23:35:45 +08:00
include::goals/build-image.adoc[leveloffset=+1]
2020-01-31 09:02:47 +08:00
2020-01-23 23:35:45 +08:00
[[build-image-examples]]
=== Examples
2020-01-31 09:02:47 +08:00
2020-01-23 23:35:45 +08:00
[[build-image-example-custom-image-builder]]
2020-04-07 09:24:26 +08:00
==== Custom Image Builder
2020-06-12 05:20:39 +08:00
If you need to customize the builder used to create the image or the run image used to launch the built image, configure the plugin as shown in the following example:
2020-01-23 23:35:45 +08:00
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
2020-01-31 07:54:15 +08:00
<version>{gradle-project-version}</version>
2020-01-28 03:12:00 +08:00
<configuration>
<image>
<builder>mine/java-cnb-builder</builder>
2020-06-12 05:20:39 +08:00
<runImage>mine/java-cnb-run</runImage>
2020-01-28 03:12:00 +08:00
</image>
</configuration>
2020-01-23 23:35:45 +08:00
</plugin>
</plugins>
</build>
</project>
----
2020-06-12 05:20:39 +08:00
This configuration will use a builder image with the name `mine/java-cnb-builder` and the tag `latest`, and the run image named `mine/java-cnb-run` and the tag `latest`.
2020-01-23 23:35:45 +08:00
2020-06-12 05:20:39 +08:00
The builder and run image can be specified on the command line as well, as shown in this example:
2020-03-18 07:40:37 +08:00
[indent=0]
----
2020-06-12 05:20:39 +08:00
$ mvn spring-boot:build-image -Dspring-boot.build-image.builder=mine/java-cnb-builder -Dspring-boot.build-image.runImage=mine/java-cnb-run
2020-03-18 07:40:37 +08:00
----
2020-04-07 09:24:26 +08:00
2020-04-07 07:20:34 +08:00
[[build-image-example-builder-configuration]]
2020-04-07 09:24:26 +08:00
==== Builder Configuration
2020-04-07 07:20:34 +08:00
If the builder exposes configuration options using environment variables, those can be set using the `env` attributes.
2020-10-09 06:02:17 +08:00
The following is an example of {paketo-java-reference}/#configuring-the-jvm-version[configuring the JVM version] used by the Paketo Java buildpacks at build time:
2020-01-28 03:56:42 +08:00
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
2020-01-31 07:54:15 +08:00
<version>{gradle-project-version}</version>
2020-01-28 03:56:42 +08:00
<configuration>
<image>
<env>
2020-08-13 06:04:17 +08:00
<BP_JVM_VERSION>8.*</BP_JVM_VERSION>
2020-01-28 03:56:42 +08:00
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
2020-10-10 02:21:37 +08:00
In a similar way, Paketo Java buildpacks support {paketo-java-reference}/#runtime-jvm-configuration[configuring JVM runtime behavior].
2020-10-09 06:02:17 +08:00
Refer to the {paketo-java-reference}[Paketo documentation] for additional configuration options supported by Paketo Java buildpacks.
2020-04-07 07:20:34 +08:00
If there is a network proxy between the Docker daemon the builder runs in and network locations that buildpacks download artifacts from, you will need to configure the builder to use the proxy.
2020-10-09 06:02:17 +08:00
When using the Paketo builder, this can be accomplished by setting the `HTTPS_PROXY` and/or `HTTP_PROXY` environment variables as show in the following example:
2020-04-07 07:20:34 +08:00
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>{gradle-project-version}</version>
<configuration>
<image>
<env>
<HTTP_PROXY>http://proxy.example.com</HTTP_PROXY>
<HTTPS_PROXY>https://proxy.example.com</HTTPS_PROXY>
</env>
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
2020-01-28 03:56:42 +08:00
2020-01-23 23:35:45 +08:00
[[build-image-example-custom-image-name]]
2020-04-07 09:24:26 +08:00
==== Custom Image Name
2020-01-31 07:54:15 +08:00
By default, the image name is inferred from the `artifactId` and the `version` of the project, something like `docker.io/library/${project.artifactId}:${project.version}`.
2020-01-23 23:35:45 +08:00
You can take control over the name, as shown in the following example:
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
2020-01-31 07:54:15 +08:00
<version>{gradle-project-version}</version>
2020-01-28 03:12:00 +08:00
<configuration>
<image>
<name>example.com/library/${project.artifactId}</name>
</image>
</configuration>
2020-01-23 23:35:45 +08:00
</plugin>
</plugins>
</build>
</project>
----
2020-01-31 07:54:15 +08:00
Note that this configuration does not provide an explicit tag so `latest` is used.
2020-03-18 07:40:37 +08:00
It is possible to specify a tag as well, either using `${project.version}`, any property available in the build or a hardcoded version.
The image name can be specified on the command line as well, as shown in this example:
[indent=0]
----
2020-05-21 05:06:48 +08:00
$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=example.com/library/my-app:v1
2020-03-18 07:40:37 +08:00
----