2020-01-23 23:35:45 +08:00
[[build-image]]
2020-04-07 09:24:26 +08:00
== Packaging OCI Images
2020-12-17 02:06:12 +08:00
The plugin can create an https://github.com/opencontainers/image-spec[OCI image] from an executable jar file 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-12-17 02:06:12 +08:00
NOTE: The `build-image` goal is not supported with projects using <<repackage, war packaging>>.
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>
<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-09-18 03:25:18 +08:00
Docker daemon connection information can also be provided using `docker` parameters in the plugin configuration.
The following table summarizes the available parameters:
|===
| Parameter | Description
| `host`
| URL containing the host and port for the Docker daemon - e.g. `tcp://192.168.99.100:2376`
| `tlsVerify`
| Enable secure HTTPS protocol when set to `true` (optional)
| `certPath`
| Path to certificate and key files for HTTPS (required if `tlsVerify` is `true`, ignored otherwise)
|===
For more details, see also <<build-image-example-docker,examples>>.
2020-01-31 09:02:47 +08:00
2020-04-01 13:51:16 +08:00
2020-08-25 03:10:01 +08:00
[[build-image-docker-registry]]
=== Docker Registry
2020-09-19 06:59:10 +08:00
If the Docker images specified by the `builder` or `runImage` parameters are stored in a private Docker image registry that requires authentication, the authentication credentials can be provided using `docker.builderRegistry` parameters.
If the generated Docker image is to be published to a Docker image registry, the authentication credentials can be provided using `docker.publishRegistry` parameters.
2020-08-25 03:10:01 +08:00
Parameters are provided for user authentication or identity token authentication.
2020-09-19 06:59:10 +08:00
Consult the documentation for the Docker registry being used to store images for further information on supported authentication methods.
2020-08-25 03:10:01 +08:00
2020-09-19 06:59:10 +08:00
The following table summarizes the available parameters for `docker.builderRegistry` and `docker.publishRegistry`:
2020-08-25 03:10:01 +08:00
|===
| Parameter | Description
| `username`
| Username for the Docker image registry user. Required for user authentication.
| `password`
| Password for the Docker image registry user. Required for user authentication.
| `url`
| Address of the Docker image registry. Optional for user authentication.
| `email`
| E-mail address for the Docker image registry user. Optional for user authentication.
| `token`
| Identity token for the Docker image registry user. Required for token authentication.
|===
For more details, see also <<build-image-example-docker,examples>>.
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-10-10 03:36:46 +08:00
| `paketobuildpacks/builder:base`
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}`
2020-08-12 07:17:36 +08:00
| `pullPolicy`
| {spring-boot-api}/buildpack/platform/build/PullPolicy.html[Policy] used to determine when to pull the builder and run images from the registry.
Acceptable values are `ALWAYS`, `NEVER`, and `IF_NOT_PRESENT`.
| `spring-boot.build-image.pullPolicy`
| `ALWAYS`
2020-01-28 03:56:42 +08:00
| `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
2021-02-19 07:28:25 +08:00
| `buildpacks`
a|Buildpacks that the builder should use when building the image.
Only the specified buildpacks will be used, overriding the default buildpacks included in the builder.
Buildpack references must be in one of the following forms:
* Buildpack in the builder - [urn:cnb:builder:]<buildpack id>[@<version>]
* Buildpack in a directory on the file system - [file://]<path>
* Buildpack in a gzipped tar (.tgz) file on the file system - [file://]<path>/<file name>
* Buildpack in an OCI image - [docker://]<host>/<repo>[:<tag>][@<digest>]
|
| None, indicating the builder should use the buildpacks included in it.
2020-01-28 03:56:42 +08:00
| `cleanCache`
| Whether to clean the cache before building.
2020-10-16 03:43:52 +08:00
| `spring-boot.build-image.cleanCache`
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-09-19 06:59:10 +08:00
| `publish`
| Whether to publish the generated image to a Docker registry.
| `spring-boot.build-image.publish`
| `false`
2020-01-28 03:56:42 +08:00
|===
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
2020-08-31 22:16:16 +08:00
For more details, see also <<build-image-examples,examples>>.
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-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>
<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>
<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-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-10-16 16:34:58 +08:00
NOTE: 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
----
2020-08-25 03:10:01 +08:00
2021-02-19 07:28:25 +08:00
[[build-image-example-buildpacks]]
==== Buildpacks
By default, the builder will use buildpacks included in the builder image and apply them in a pre-defined order.
An alternative set of buildpacks can be provided to apply buildpacks that are not included in the builder, or to change the order of included buildpacks.
When one or more buildpacks are provided, only the specified buildpacks will be applied.
The following example instructs the builder to use a custom buildpack packaged in a `.tgz` file, followed by a buildpack included in the builder.
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
2021-02-19 08:22:36 +08:00
<image>
<buildpacks>
<buildpack>file:///path/to/example-buildpack.tgz</buildpack>
<buildpack>urn:cnb:builder:paketo-buildpacks/java</buildpack>
</buildpacks>
2021-02-19 07:28:25 +08:00
</image>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
Buildpacks can be specified in any of the forms shown below.
A buildpack located in a CNB Builder (version may be omitted if there is only one buildpack in the builder matching the `buildpack-id`):
* `urn:cnb:builder:buildpack-id`
* `urn:cnb:builder:buildpack-id@0.0.1`
* `buildpack-id`
* `buildpack-id@0.0.1`
A path to a directory containing buildpack content (not supported on Windows):
* `\file:///path/to/buildpack/`
* `/path/to/buildpack/`
A path to a gzipped tar file containing buildpack content:
* `\file:///path/to/buildpack.tgz`
* `/path/to/buildpack.tgz`
2021-02-19 08:22:36 +08:00
An OCI image containing a https://buildpacks.io/docs/buildpack-author-guide/package-a-buildpack/[packaged buildpack]:
2021-02-19 07:28:25 +08:00
* `docker://example/buildpack`
* `docker:///example/buildpack:latest`
* `docker:///example/buildpack@sha256:45b23dee08...`
* `example/buildpack`
* `example/buildpack:latest`
* `example/buildpack@sha256:45b23dee08...`
2020-09-19 06:59:10 +08:00
[[build-image-example-publish]]
==== Image Publishing
The generated image can be published to a Docker registry by enabling a `publish` option and configuring authentication for the registry using `docker.publishRegistry` parameters.
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<name>docker.example.com/library/${project.artifactId}</name>
<publish>true</publish>
</image>
<docker>
<publishRegistry>
<username>user</username>
<password>secret</password>
<url>https://docker.example.com/v1/</url>
<email>user@example.com</email>
2020-10-11 21:39:50 +08:00
</publishRegistry>
2020-09-19 06:59:10 +08:00
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
The `publish` option can be specified on the command line as well, as shown in this example:
[indent=0]
----
$ mvn spring-boot:build-image -Dspring-boot.build-image.imageName=docker.example.com/library/my-app:v1 -Dspring-boot.build-image.publish=true
----
2020-08-25 03:10:01 +08:00
[[build-image-example-docker]]
==== Docker Configuration
2020-09-18 03:25:18 +08:00
If you need the plugin to communicate with the Docker daemon using a remote connection instead of the default local connection, the connection details can be provided using `docker` parameters 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>
<configuration>
<docker>
<host>tcp://192.168.99.100:2376</host>
<tlsVerify>true</tlsVerify>
<certPath>/home/user/.minikube/certs</certPath>
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
2020-09-19 06:59:10 +08:00
If the builder or run image are stored in a private Docker registry that supports user authentication, authentication details can be provided using `docker.builderRegistry` parameters as shown in the following example:
2020-08-25 03:10:01 +08:00
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
2020-09-19 06:59:10 +08:00
<builderRegistry>
2020-08-25 03:10:01 +08:00
<username>user</username>
<password>secret</password>
<url>https://docker.example.com/v1/</url>
<email>user@example.com</email>
2020-09-19 06:59:10 +08:00
</builderRegistry>
2020-08-25 03:10:01 +08:00
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
----
2020-09-19 06:59:10 +08:00
If the builder or run image is stored in a private Docker registry that supports token authentication, the token value can be provided using `docker.builderRegistry` parameters as shown in the following example:
2020-08-25 03:10:01 +08:00
[source,xml,indent=0,subs="verbatim,attributes"]
----
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<docker>
2020-09-19 06:59:10 +08:00
<builderRegistry>
2020-08-25 03:10:01 +08:00
<token>9cbaf023786cd7...</token>
2020-09-19 06:59:10 +08:00
</builderRegistry>
2020-08-25 03:10:01 +08:00
</docker>
</configuration>
</plugin>
</plugins>
</build>
</project>
----