Files
jreleaser.github.io/docs/modules/configuration/pages/packagers/docker.adoc
2021-04-12 13:52:54 +02:00

603 lines
15 KiB
Plaintext

= Docker
Creates link:https://www.docker.com/[Docker] images.
NOTE: Only artifacts with `.zip`, `.jar` extension may be packaged with Docker.
WARNING: Snapshots are *not* supported.
IMPORTANT: Building and publishing docker images requires the `docker` command and a running Docker deamon.
JReleaser will not install these tools.
include::partial$legend.adoc[]
[tabs]
====
YAML::
+
[source,yaml]
[subs="+macros"]
----
# icon:dot-circle[]
packagers:
# icon:dot-circle[]
docker:
# Enables or disables Docker.
# Defaults to `false`.
# icon:dot-circle[]
enabled: true
# Directory with file templates used to prepare the Docker distribution
# Defaults to `src/distribution/${distribution.name}/docker`.
# If specified, path must exist.
# icon:dot-circle[]
templateDirectory: path/to/docker/templates
# The base Docker image to use.
# icon:dot-circle[] icon:file-alt[]
baseImage: "alpine:3.5"
# A list of image names.
# If unspecified, a single image `{{repoOwner}}/{{distributionName}}:{{tagName}}`
# will be created.
# icon:dot-circle[] icon:file-alt[]
imageNames:
- "{{repoOwner}}/{{distributionName}}:{{tagName}}"
- "duke/app:latest"
# A list of build arguments
# icon:dot-circle[] icon:file-alt[]
buildArgs:
- "--pull"
# A map of Docker labels.
# icon:dot-circle[]
labels:
foo: bar
# Additional properties used when evaluating templates.
# icon:dot-circle[]
extraProperties:
# Key will be capitalized and prefixed with `docker`, i.e, `dockerFoo`.
foo: bar
# A list of docker registries where images will be published.
# Image publication will be disabled if no registries are configured.
# icon:dot-circle[]
registries:
# The name of the registry. Must be unique.
# Use `DEFAULT` to match the default registry
# provided by the Docker daemon.
# icon:exclamation-triangle[]
- serverName: myRegistry
# The address of the docker registry.
# icon:exclamation-triangle[] if `serverName != DEFAULT`.
server: pass:[https://myregistry.com]
# The user that can publish images.
# Defaults to the same username as the release repository.
# icon:dot-circle[]
username: duke
# Password for login into the registry
# If left unspecified, the `JRELEASER_DOCKER_${serverName}_PASSWORD`
# environment variable must be defined.
# icon:dot-circle[] icon:eye-slash[]
password: __DO_NOT_SET_HERE__
# The name of the repository
# Defaults to the same owner as the release repository.
# icon:dot-circle[]
repositoryName: duke
----
JSON::
+
[source,json]
[subs="+macros"]
----
{
// icon:dot-circle[]
"packagers": {
// icon:dot-circle[]
"docker": {
// Enables or disables Docker.
// Defaults to `false`.
// icon:dot-circle[]
"enabled": true,
// Directory with file templates used to prepare the Docker distribution
// Defaults to `src/distribution/${distribution.name}/docker`.
// If specified, path must exist.
// icon:dot-circle[]
"templateDirectory": "path/to/docker/templates",
// The base Docker image to use.
// icon:dot-circle[] icon:file-alt[]
"baseImage": "alpine:3.5",
// A list of image names.
// If unspecified, a single image `{{repoOwner}}/{{distributionName}}:{{tagName}}`
// will be created.
// icon:dot-circle[] icon:file-alt[]
"imageNames": [
"{{repoOwner}}/{{distributionName}}:{{tagName}}",
"duke/app:latest"
],
// A list of build arguments
// icon:dot-circle[] icon:file-alt[]
"buildArgs": [
"--pull"
],
// A map of Docker labels.
// icon:dot-circle[]
"labels": {
"foo": "bar"
},
// Additional properties used when evaluating templates.
// icon:dot-circle[]
"extraProperties": {
// Key will be capitalized and prefixed with `docker`, i.e, `dockerFoo`.
"foo": "bar"
},
// A list of docker registries where images will be published.
// Image publication will be disabled if no registries are configured.
// icon:dot-circle[]
"registries": [
{
// The name of the registry. Must be unique.
// Use `DEFAULT` to match the default registry
// provided by the Docker daemon.
// icon:exclamation-triangle[]
"serverName": "someName",
// The address of the docker registry.
// icon:exclamation-triangle[] if `serverName != DEFAULT`.
"server": "pass:[https://myregistry.com]",
// The user that can publish images.
// Defaults to the same username as the release repository.
// icon:dot-circle[]
"username": "duke",
// Password for login into the registry
// If left unspecified, the `JRELEASER_DOCKER_${serverName}_PASSWORD`
// environment variable must be defined.
// icon:dot-circle[] icon:eye-slash[]
"password": "__DO_NOT_SET_HERE__",
// The name of the repository
// Defaults to the same owner as the release repository.
// icon:dot-circle[]
"repositoryName": "duke"
}
]
}
}
}
----
Maven::
+
[source,xml]
[subs="+macros,verbatim"]
----
<jreleaser>
<!--
icon:dot-circle[]
-->
<packagers>
<!--
icon:dot-circle[]
-->
<docker>
<!--
Enables or disables Docker.
Defaults to `false`.
icon:dot-circle[]
-->
<enabled>true</enabled>
<!--
Directory with file templates used to prepare the Docker distribution
Defaults to `src/distribution/${distribution.name}/docker`.
If specified, path must exist.
icon:dot-circle[]
-->
<templateDirectory>>path/to/docker/templates</templateDirectory>
<!--
The base Docker image to use.
icon:dot-circle[] icon:file-alt[]
-->
<baseImage>alpine:3.5</baseImage>
<!--
A list of image names.
If unspecified, a single image `{{repoOwner}}/{{distributionName}}:{{tagName}}`
will be created.
icon:dot-circle[] icon:file-alt[]
-->
<imageNames>
<imageName>{{repoOwner}}/{{distributionName}}:{{tagName}}</imageName>
<imageName>duke/app:latest</imageName>
</imageNames>
<!--
A list of build arguments
icon:dot-circle[] icon:file-alt[]
-->
<buildArgs>
<buildArg>--pull</buildArg>
</buildArgs>
<!--
A map of Docker labels.
icon:dot-circle[]
-->
<labels>
<foo>bar</foo>
</labels>
<!--
Additional properties used when evaluating templates.
icon:dot-circle[]
-->
<extraProperties>
<!--
Key will be capitalized and prefixed with `docker`, i.e, `dockerFoo`.
-->
<foo>bar</foo>
</extraProperties>
<!--
A list of docker registries where images will be published.
Image publication will be disabled if no registries are configured.
icon:dot-circle[]
-->
<registries>
<registry>
<!--
The name of the registry. Must be unique.
Use `DEFAULT` to match the default registry
provided by the Docker daemon.
icon:exclamation-triangle[]
-->
<serverName>myRegistry</serverName>
<!--
The address of the docker registry.
icon:exclamation-triangle[] if `serverName != DEFAULT`.
-->
<server>pass[https: myregistry.com]</server>
<!--
The user that can publish images.
Defaults to the same username as the release repository.
icon:dot-circle[]
-->
<username>duke</username>
<!--
Password for login into the registry
If left unspecified, the `JRELEASER_DOCKER_${serverName}_PASSWORD`
environment variable must be defined.
icon:dot-circle[] icon:eye-slash[]
-->
<password>__DO_NOT_SET_HERE__</password>
<!--
The name of the repository
Defaults to the same owner as the release repository.
icon:dot-circle[]
-->
<repositoryName>duke</repositoryName>
</registry>
</registries>
</docker>
</packagers>
</jreleaser>
----
Gradle::
+
[source,groovy]
[subs="+macros"]
----
jreleaser {
// icon:dot-circle[]
packagers {
// icon:dot-circle[]
docker {
// Enables or disables Docker.
// Defaults to `false`.
// icon:dot-circle[]
enabled = true
// Directory with file templates used to prepare the Docker distribution
// Defaults to `src/distribution/${distribution.name}/docker`.
// If specified, path must exist.
// icon:dot-circle[]
templateDirectory = 'path/to/docker/templates'
// The base Docker image to use.
// icon:dot-circle[] icon:file-alt[]
baseImage = 'alpine:3.5'
// A list of image names.
// If unspecified, a single image `{{repoOwner}}/{{distributionName}}:{{tagName}}`
// will be created.
// icon:dot-circle[] icon:file-alt[]
addImageName('{{repoOwner}}/{{distributionName}}:{{tagName}}')
addImageName('duke/app:latest')
// A list of build arguments
// icon:dot-circle[] icon:file-alt[]
addBuildArg('--pull')
// A map of Docker labels.
// The key `openjdk@${java.version}` will be added automatically if not defined.
// icon:dot-circle[]
addLabel('foo', 'bar')
// Additional properties used when evaluating templates.
// Key will be capitalized and prefixed with `scoop`, i.e, `scoopFoo`.
// icon:dot-circle[]
extraProperties.put('foo', 'bar')
// A list of docker registries where images will be published.
// Image publication will be disabled if no registries are configured.
// icon:dot-circle[]
registries {
// The name of the registry. Must be unique.
// Use `DEFAULT` to match the default registry
// provided by the Docker daemon.
// icon:exclamation-triangle[]
someName {
// The address of the docker registry.
// icon:exclamation-triangle[] if `serverName != DEFAULT`.
server = 'pass:[https://myregistry.com]'
// The user that can publish images.
// Defaults to the same username as the release repository.
// icon:dot-circle[]
username = 'duke'
// Password for login into the registry
// If left unspecified, the `JRELEASER_DOCKER_${serverName}_PASSWORD`
// environment variable must be defined.
// icon:dot-circle[] icon:eye-slash[]
password = '__DO_NOT_SET_HERE__'
// The name of the repository
// Defaults to the same owner as the release repository.
// icon:dot-circle[]
repositoryName = 'duke'
}
}
}
}
}
----
====
Assuming that the current version is `1.2.3`, and a distribution named `app`, the above configuration will generate
a Dockerfile like the following one:
[source,dockerfile]
----
FROM azul/zulu-openjdk-alpine:8-jre
LABEL "org.opencontainers.image.title"="app"
LABEL "org.opencontainers.image.description"="Awesome App"
LABEL "org.opencontainers.image.url"="https://acme.com/app"
LABEL "org.opencontainers.image.licenses"="Apache-2.0"
LABEL "org.opencontainers.image.version"="1.2.3"
LABEL "org.opencontainers.image.revision"="de0266d314b91dd201765616e207d0a8706d0b99"
COPY assembly/app-1.2.3.zip /app-1.2.3.zip
RUN unzip app-1.2.3.zip && \
rm app-1.2.3.zip && \
mv app-* app && \
chmod +x app/bin/app
ENV PATH="${PATH}:/app/bin"
ENTRYPOINT ["/app/bin/app"]
----
== Default Labels
JReleaser will add the following labels if they are not explicitly defined:
* org.opencontainers.image.title = {{distributionName}}
* org.opencontainers.image.description = {{projectDescription}}
* org.opencontainers.image.url = {{projectWebsite}}
* org.opencontainers.image.licenses = {{projectLicense}}
* org.opencontainers.image.version = {{projectVersion}}
* org.opencontainers.image.revision = {{commitFullHash}}
You may use any xref:configuration:name-templates.adoc[] as part of the label value.
== Generic Image Names
Some users might want to keep their image name as generic as possible. That can be accomplished simply by adding
a template to the `imageNames` field.
[tabs]
====
YAML::
+
[source,yaml]
[subs="+macros"]
----
project:
name: app
packagers:
docker:
enabled: true
imageNames:
- "myuser/{{projectName}}"
----
JSON::
+
[source,json]
[subs="+macros"]
----
{
"project": {
"name": "app"
},
"packagers": {
"docker": {
"enabled": true,
"imageNames": [
"myuser/{{projectName}}"
]
}
}
}
----
Maven::
+
[source,xml]
[subs="+macros,verbatim"]
----
<!-- project.artifactId = app -->
<jreleaser>
<packagers>
<docker>
<enabled>true</enabled>
<imageNames>
<imageName>myuser/{{projectName}}</imageName>
</imageNames>
</docker>
</packagers>
</jreleaser>
----
Gradle::
+
[source,groovy]
[subs="+macros"]
----
// project.name = app
jreleaser {
packagers {
docker {
enabled = true
addImageName('myuser/{{projectName}}')
}
}
}
----
====
This will build the following images:
* `myuser/app`
== Keeping docker images updated for current major
Some users might want to when version to push docker tags `:v1`, `:v1.6`, `:v1.6.4` and `:latest` when `v1.6.4`
(for example) is built. That can be accomplished by using multiple image names:
[tabs]
====
YAML::
+
[source,yaml]
[subs="+macros"]
----
project:
name: app
packagers:
docker:
enabled: true
imageNames:
- "myuser/myimage:{{tagName}}"
- "myuser/myimage:v{{projectVersionMajor}}"
- "myuser/myimage:v{{projectVersionMajor}}.{{projectVersionMinor}}"
- "myuser/myimage:latest"
----
JSON::
+
[source,json]
[subs="+macros"]
----
{
"project": {
"name": "app"
},
"packagers": {
"docker": {
"enabled": true,
"imageNames": [
"myuser/myimage:{{tagName}}",
"myuser/myimage:v{{projectVersionMajor}}",
"myuser/myimage:v{{projectVersionMajor}}.{{projectVersionMinor}}",
"myuser/myimage:latest"
]
}
}
}
----
Maven::
+
[source,xml]
[subs="+macros,verbatim"]
----
<!-- project.artifactId = app -->
<jreleaser>
<packagers>
<docker>
<enabled>true</enabled>
<imageNames>
<imageName>myuser/myimage:{{tagName}}</imageName>
<imageName>myuser/myimage:v{{projectVersionMajor}}</imageName>
<imageName>myuser/myimage:v{{projectVersionMajor}}.{{projectVersionMinor}}</imageName>
<imageName>myuser/myimage:latest</imageName>
</imageNames>
</docker>
</packagers>
</jreleaser>
----
Gradle::
+
[source,groovy]
[subs="+macros"]
----
// project.name = app
jreleaser {
packagers {
docker {
enabled = true
addImageName('myuser/myimage:{{tagName}}')
addImageName('myuser/myimage:v{{projectVersionMajor}}')
addImageName('myuser/myimage:v{{projectVersionMajor}}.{{projectVersionMinor}}')
addImageName('myuser/myimage:latest')
}
}
}
----
====
This will build the following images:
* `myuser/myimage:v1.6.4`
* `myuser/myimage:v1`
* `myuser/myimage:v1.6`
* `myuser/myimage:latest`