blob: c42221fce1fae21867b97703d70e85bdc8a3eeb6 [file] [log] [blame]
{"componentChunkName":"component---src-templates-doc-jsx","path":"/docs/openshift-maven-plugin","result":{"data":{"asciidocCopy":{"html":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>&#169; 2020 The original authors.</p>\n</div>\n<div id=\"toc\" class=\"toc\">\n<div id=\"toctitle\" class=\"title\">openshift-maven-plugin</div>\n<ul class=\"sectlevel1\">\n<li><a href=\"#introduction\">1. Introduction</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#building-images\">1.1. Building Images</a></li>\n<li><a href=\"#resource-descriptors\">1.2. Kubernetes Resources</a></li>\n<li><a href=\"#_configuration\">1.3. Configuration</a></li>\n<li><a href=\"#_examples\">1.4. Examples</a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#zero-config\">1.4.1. Zero-Config</a></li>\n<li><a href=\"#_xml_configuration\">1.4.2. XML Configuration</a></li>\n<li><a href=\"#_resource_fragments\">1.4.3. Resource Fragments</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#compatibility-with-OpenShift\">2. Compatibility with OpenShift</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#openshift-compatibility\">2.1. OpenShift Compatibility</a></li>\n</ul>\n</li>\n<li><a href=\"#installation\">3. Installation</a></li>\n<li><a href=\"#goals\">4. Goals Overview</a></li>\n<li><a href=\"#goals-overview-build\">5. Build Goals</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#jkube:resource\">5.1. <strong>oc:resource</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#resource-labels-annotations\">5.1.1. Labels and Annotations</a></li>\n<li><a href=\"#resource-secrets\">5.1.2. Secrets</a></li>\n<li><a href=\"#resource-validation\">5.1.3. Resource Validation</a></li>\n<li><a href=\"#resource-route-generation\">5.1.4. Route Generation</a></li>\n<li><a href=\"#Supported-Properties-Resource\">5.1.5. Supported Properties for Resource goal</a></li>\n</ul>\n</li>\n<li><a href=\"#jkube:build\">5.2. <strong>oc:build</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#build-kubernetes\">5.2.1. Kubernetes Build</a></li>\n<li><a href=\"#build-openshift\">5.2.2. OpenShift Build</a></li>\n<li><a href=\"#build-goal-configuration\">5.2.3. Configuration (XML)</a></li>\n<li><a href=\"#_kubernetes_access_configuration\">5.2.4. Kubernetes Access Configuration</a></li>\n<li><a href=\"#_image_configuration\">5.2.5. Image Configuration</a></li>\n<li><a href=\"#build-configuration\">5.2.6. Build Configuration</a></li>\n<li><a href=\"#build-assembly\">5.2.7. Assembly</a></li>\n<li><a href=\"#misc-env\">5.2.8. Environment and Labels</a></li>\n<li><a href=\"#misc-startup\">5.2.9. Startup Arguments</a></li>\n<li><a href=\"#build-buildargs\">5.2.10. Build Args</a></li>\n<li><a href=\"#build-healthcheck\">5.2.11. Healthcheck</a></li>\n</ul>\n</li>\n<li><a href=\"#jkube:push\">5.3. <strong>oc:push</strong></a></li>\n<li><a href=\"#jkube:apply\">5.4. <strong>oc:apply</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#Supported-Properties-Apply\">5.4.1. Supported Properties For Apply goal</a></li>\n</ul>\n</li>\n<li><a href=\"#jkube:helm\">5.5. <strong>oc:helm</strong></a></li>\n</ul>\n</li>\n<li><a href=\"#goals-overview-develop\">6. Development Goals</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#jkube:deploy\">6.1. <strong>oc:deploy</strong></a></li>\n<li><a href=\"#jkube:undeploy\">6.2. <strong>oc:undeploy</strong></a></li>\n<li><a href=\"#jkube:log\">6.3. <strong>oc:log</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#Supported-Properties-Log\">6.3.1. Supported Properties for Log goal</a></li>\n</ul>\n</li>\n<li><a href=\"#jkube:debug\">6.4. <strong>oc:debug</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#_speeding_up_debugging\">6.4.1. Speeding up debugging</a></li>\n<li><a href=\"#_debugging_with_suspension\">6.4.2. Debugging with suspension</a></li>\n<li><a href=\"#Supported-Properties-Debug\">6.4.3. Supported Properties For Debug Goal</a></li>\n</ul>\n</li>\n<li><a href=\"#jkube:watch\">6.5. <strong>oc:watch</strong></a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#watcher-spring-boot\">6.5.1. Spring Boot</a></li>\n<li><a href=\"#watcher-docker-image\">6.5.2. Docker Image</a></li>\n<li><a href=\"#Supported-Properties-Watch\">6.5.3. Supported Properties for Watch goal</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#generators\">7. Generators</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#generators-default\">7.1. Default Generators</a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#generator-java-exec\">7.1.1. Java Applications</a></li>\n<li><a href=\"#generator-spring-boot\">7.1.2. Spring Boot</a></li>\n<li><a href=\"#generator-wildfly-swarm\">7.1.3. Wildfly Swarm</a></li>\n<li><a href=\"#generator-thorntail-v2\">7.1.4. Thorntail v2</a></li>\n<li><a href=\"#generator-vertx\">7.1.5. Vert.x</a></li>\n<li><a href=\"#generator-karaf\">7.1.6. Karaf</a></li>\n<li><a href=\"#generator-webapp\">7.1.7. Web Applications</a></li>\n<li><a href=\"#generator-quarkus\">7.1.8. Quarkus</a></li>\n<li><a href=\"#generator-openliberty\">7.1.9. Open Liberty</a></li>\n<li><a href=\"#generator-wildfly-jar\">7.1.10. Wildfly JAR Generator</a></li>\n</ul>\n</li>\n<li><a href=\"#generators-api\">7.2. Generator API</a></li>\n</ul>\n</li>\n<li><a href=\"#enrichers\">8. Enrichers</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#enrichers-default\">8.1. Default Enrichers</a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#enrichers-generic\">8.1.1. Generic Enrichers</a></li>\n<li><a href=\"#enrichers-specific\">8.1.2. Specific Enrichers</a></li>\n</ul>\n</li>\n<li><a href=\"#_enricher_api\">8.2. Enricher API</a></li>\n</ul>\n</li>\n<li><a href=\"#profiles\">9. Profiles</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#generator-enricher-definition\">9.1. Generator and Enricher definitions</a></li>\n<li><a href=\"#profiles-lookup-order\">9.2. Lookup order</a></li>\n<li><a href=\"#profiles-using\">9.3. Using Profiles</a></li>\n<li><a href=\"#profiles-predefined\">9.4. Predefined Profiles</a></li>\n<li><a href=\"#profiles-extended\">9.5. Extending Profiles</a></li>\n</ul>\n</li>\n<li><a href=\"#access-configuration\">10. Access configuration</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_docker_access\">10.1. Docker Access</a></li>\n<li><a href=\"#_openshift_and_kubernetes_access\">10.2. OpenShift and Kubernetes Access</a></li>\n</ul>\n</li>\n<li><a href=\"#registry\">11. Registry handling</a></li>\n<li><a href=\"#authentication\">12. Authentication</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_pull_vs_push_authentication\">12.1. Pull vs. Push Authentication</a></li>\n<li><a href=\"#_openshift_authentication\">12.2. OpenShift Authentication</a></li>\n<li><a href=\"#password-encryption\">12.3. Password encryption</a></li>\n<li><a href=\"#extended-authentication\">12.4. Extended Authentication</a></li>\n</ul>\n</li>\n<li><a href=\"#volume-configuration\">13. Volume Configuration</a></li>\n<li><a href=\"#integrations\">14. Integrations</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#integrations.dekorate\">14.1. Dekorate</a></li>\n<li><a href=\"#_jib_java_image_builder\">14.2. JIB (Java Image Builder)</a></li>\n</ul>\n</li>\n<li><a href=\"#faq\">15. FAQ</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_general_questions\">15.1. General questions</a>\n<ul class=\"sectlevel3\">\n<li><a href=\"#_how_do_i_define_an_environment_variable\">15.1.1. How do I define an environment variable?</a></li>\n<li><a href=\"#_how_do_i_define_a_system_property\">15.1.2. How do I define a system property?</a></li>\n<li><a href=\"#_how_do_i_mount_a_config_file_from_a_configmap\">15.1.3. How do I mount a config file from a ConfigMap?</a></li>\n<li><a href=\"#_how_do_i_use_a_persistent_volume\">15.1.4. How do I use a Persistent Volume?</a></li>\n<li><a href=\"#_how_do_i_generate_ingress_for_my_generated_service\">15.1.5. How do I generate Ingress for my generated Service?</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"#appendix\">16. Appendix</a>\n<ul class=\"sectlevel2\">\n<li><a href=\"#_kindfilename_type_mapping\">16.1. Kind/Filename Type Mapping</a></li>\n<li><a href=\"#_custom_kindfilename_mapping\">16.2. Custom Kind/Filename Mapping</a></li>\n</ul>\n</li>\n</ul>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"introduction\">1. Introduction</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The <strong>openshift-maven-plugin</strong> brings your Java applications on to\n<a href=\"https://www.openshift.com/\">OpenShift</a>.\nIt provides a tight integration into <a href=\"http://maven.apache.org\">Maven</a> and benefits from the build configuration already provided.\nThis plugin focus on two tasks: <em>Building Docker images</em> and <em>creating Kubernetes resource descriptors</em>.\nIt can be configured very flexibly and supports multiple configuration models for creating: A <em>Zero-Config</em> setup allows for a quick ramp-up with some opinionated defaults.\nFor more advanced requirements, an <em>XML configuration</em> provides additional configuration options which can be added to the <code>pom.xml</code>.\nFor the full power, in order to tune all facets of the creation, external <em>resource fragments</em> and <em>Dockerfiles</em> can be used.</p>\n</div>\n<div class=\"sect2\">\n<h3 id=\"building-images\">1.1. Building Images</h3>\n<div class=\"paragraph\">\n<p>The <a href=\"#jkube:build\"><strong>oc:build</strong></a> goal is for creating Docker images containing the actual application. These then can be deployed later on Kubernetes or OpenShift.\nIt is easy to include build artifacts and their dependencies into these images.\nThis plugin uses the assembly descriptor format similar to the one used in\n<a href=\"http://maven.apache.org/plugins/maven-assembly-plugin/\">maven-assembly-plugin</a> to specify the content which will be added\nto the image.\nThat images can then be pushed to public or private Docker registries with <a href=\"#jkube:push\"><strong>oc:push</strong></a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Depending on the operational mode, for building the actual image either a Docker daemon is used directly or an <a href=\"https://docs.openshift.com/enterprise/3.0/architecture/core_concepts/builds_and_image_streams.html#docker-build\">OpenShift Docker Build</a> is performed.</p>\n</div>\n<div class=\"paragraph\">\n<p>A special <a href=\"#jkube:watch\"><strong>oc:watch</strong></a> goal allows for reacting to code changes to automatically recreate images or copy new artifacts into running containers.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"resource-descriptors\">1.2. Kubernetes Resources</h3>\n<div class=\"paragraph\">\n<p>Kubernetes resource descriptors can be created or generated from <a href=\"#jkube:resource\"><strong>oc:resource</strong></a>.\nThese files are packaged within the Maven artifacts and can be deployed to a running orchestration platform with <a href=\"#jkube:apply\"><strong>oc:apply</strong></a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Typically you only specify a small part of the real resource descriptors which will be enriched by this plugin with various extra information taken from the <code>pom.xml</code>.\nThis drastically reduces boilerplate code for common scenarios.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_configuration\">1.3. Configuration</h3>\n<div class=\"paragraph\">\n<p>As mentioned already there are three levels of configuration:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><strong>Zero-Config</strong> mode makes some very opinionated decisions based on what is present in the pom.xml like what base image to use or which ports to expose.\nThis is great for starting up things and for keeping quickstart applications small and tidy.</p>\n</li>\n<li>\n<p><strong>XML plugin configuration</strong> mode is similar to what <a href=\"https://dmp.fabric8.io/#example\">docker-maven-plugin</a> provides.\nThis allows for type-safe configuration with IDE support, but only a subset of possible resource descriptor features is provided.</p>\n</li>\n<li>\n<p><strong>Kubernetes &amp; OpenShift resource fragments</strong> are user provided YAML files that can be <em>enriched</em> by the plugin. This allows expert users to use a plain configuration file with all their capabilities, but also to add project specific build information and avoid boilerplate code.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>The following table gives an overview of the different models</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 1. Configuration Models</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 50%;\">\n<col style=\"width: 37.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Model</th>\n<th class=\"tableblock halign-left valign-top\">Docker Images</th>\n<th class=\"tableblock halign-left valign-top\">Resource Descriptors</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Zero-Config</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generators\">Generators</a> are used to create Docker image configurations. Generators can detect certain aspects of\n the build (e.g. whether Spring Boot is used) and then choose some opinionated defaults like the base image, which\n ports to expose and the startup command. They can be configured, but offer only a few options.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Default <a href=\"#enrichers\">Enrichers</a> will create a default <em>Service</em> and <em>Deployment</em> (<em>DeploymentConfig</em> for OpenShift)\n when no other resource objects are provided. Depending on the image they can detect which port to expose in the\n service. As with Generators, Enrichers support a limited set of configuration options.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>XML configuration</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">openshift-maven-plugin inherits the XML based configuration for building images from the\n <a href=\"https://dmp.fabric8.io/#docker:build\">docker-maven-plugin</a> and provides the same functionality. It supports an\n <a href=\"http://maven.apache.org/components/plugins/maven-assembly-plugin/assembly.html\">assembly descriptor</a> for specifying the\n content of the Docker image.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A subset of possible resource objects can be configured with a dedicated XML syntax. With a decent IDE you get\n autocompletion on most objects and inline documentation for the available configuration elements. The provided\n configuration can be still enhanced by Enhancers which is useful for adding e.g. labels and annotations containing\n build or other information.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Resource Fragments</strong> and <strong>Dockerfiles</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Similarly to the docker-maven-plugin, openshift-maven-plugin supports <a href=\"#external-dockerfile\">external Dockerfiles</a> too, which are\n referenced from the plugin configuration.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Resource descriptors can be provided as external YAML files which will build a base skeleton for the applicable resource.</p>\n<p class=\"tableblock\"> The \"skeleton\" is then post-processed by <a href=\"#enrichers\">Enrichers</a> which will complete the skeleton by adding the fields\n each enricher is responsible of (labels, annotations, port information, etc.). Maven properties within these files\n are resolved to their values.</p>\n<p class=\"tableblock\"> With this model you can use every Kubernetes / OpenShift resource objects with all their flexibility, but still get the benefit\n of adding build information.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_examples\">1.4. Examples</h3>\n<div class=\"paragraph\">\n<p>Let&#8217;s have a look at some code. The following examples will demonstrate all three configurations variants:</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"zero-config\">1.4.1. Zero-Config</h4>\n<div class=\"paragraph\">\n<p>This minimal but full working example <code>pom.xml</code> shows how a simple spring boot application can be dockerized and\nprepared for Kubernetes. The full example can be found in directory\n<a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/zero-config\">quickstarts/maven/zero-config</a>.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;project&gt;\n &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;\n\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;jkube-maven-sample-zero-config&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;packaging&gt;jar&lt;/packaging&gt;\n\n &lt;parent&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;version&gt;1.5.5.RELEASE&lt;/version&gt;\n &lt;/parent&gt;\n\n &lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n &lt;/dependency&gt;\n &lt;/dependencies&gt;\n\n &lt;build&gt;\n &lt;plugins&gt;\n &lt;plugin&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n &lt;/plugin&gt;\n &lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt; <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;/plugin&gt;\n &lt;/plugins&gt;\n &lt;/build&gt;\n&lt;/project&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>This minimalistic spring boot application uses the spring-boot parent POM for setting up dependencies and plugins</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td>The Spring Boot web starter dependency enables a simple embedded Tomcat for serving Spring MVC apps</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td>The <code>spring-boot-maven-plugin</code> is responsible for repackaging the application into a fat jar, including all dependencies and the embedded Tomcat</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td>The <code>openshift-maven-plugin</code> enables the automatic generation of a Docker image and Kubernetes / OpenShift descriptors including this Spring application.</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>This setup make some opinionated decisions for you:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>As base image <a href=\"https://quay.io/repository/jkube/jkube-java-binary-s2i\">jkube/jkube-java-binary-s2i</a>\nis chosen which enables <a href=\"https://www.jolokia.org\">Jolokia</a> and <a href=\"https://github.com/prometheus/jmx_exporter\">jmx_exporter</a>.\nIt also comes with a sophisticated <a href=\"https://github.com/jboss-openshift/cct_module/tree/master/jboss/container/java/run/bash\">startup script</a>.</p>\n</li>\n<li>\n<p>It will create a Kubernetes <a href=\"http://kubernetes.io/docs/user-guide/deployments/\">Deployment</a> and a\n<a href=\"http://kubernetes.io/docs/user-guide/services/\">Service</a> as resource objects</p>\n</li>\n<li>\n<p>It exports port 8080 as the application service port (and 8778 and 9779 for Jolokia and jmx_exporter access, respectively)</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>These choices can be influenced by configuration options as described in <a href=\"#generator-spring-boot\">Spring Boot Generator</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>To start the Docker image build, you simply run</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mvn package oc:build</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This will create the Docker image against a running Docker daemon (which must be accessible either via Unix Socket or\nwith the URL set in <code>DOCKER_HOST</code>). Alternatively, when connected to an OpenShift cluster then a <a href=\"https://docs.openshift.com/enterprise/3.0/using_images/s2i_images/index.html\">S2I</a> build will be performed on OpenShift which at the end creates an\n<a href=\"https://docs.openshift.com/enterprise/3.1/architecture/core_concepts/builds_and_image_streams.html\">ImageStream</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>To deploy the resources to the cluster call</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mvn oc:resource oc:deploy</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>By default a <em>Service</em> and a <em>Deployment</em> object pointing to the created Docker image is created. When running in OpenShift mode, a <em>Service</em> and <em>DeploymentConfig</em> which refers the <em>ImageStream</em> created with <code>oc:build</code> will be installed.</p>\n</div>\n<div class=\"paragraph\">\n<p>Of course you can bind all those jkube-goals to execution phases as well, so that they are called along with standard lifecycle goals like <code>install</code>. For example, to bind the building of the Kubernetes resource files and the Docker images, add the following goals to the execution of the openshift-maven-plugin:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for lifecycle bindings</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n\n &lt;!-- ... --&gt;\n\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If you&#8217;d also like to automatically deploy to Kubernetes each time you do a <code>mvn install</code> you can add the <code>apply</code> goal:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for lifecycle bindings with automatic deploys for mvn install</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n\n &lt;!-- ... --&gt;\n\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;goal&gt;apply&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_xml_configuration\">1.4.2. XML Configuration</h4>\n<div class=\"admonitionblock warning\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-warning\" title=\"Warning\"></i>\n</td>\n<td class=\"content\">\nXML based configuration is only partially implemented and is not recommended for use right now.\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>Although the Zero-config mode and its generators can be tweaked with options up to a certain degree, many cases require more flexibility. For such instances, an XML-based plugin configuration can be used, in a way similar to the\n<a href=\"https://dmp.fabric8.io/#configuration\">XML configuration</a> used by <code>docker-maven-plugin</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>The plugin configuration can be roughly divided into the following sections:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Global configuration options are responsible for tuning the behaviour of plugin goals</p>\n</li>\n<li>\n<p><code>&lt;images&gt;</code> defines which Docker <a href=\"#image-configuration\">images</a> are used and configured. This section is similar to the\n<a href=\"https://dmp.fabric8.io//#image-configuration\">image configuration</a> of the <code>docker-maven-plugin</code>, except that <code>&lt;run&gt;</code>\nand <code>&lt;external&gt;</code> sub-elements are ignored)</p>\n</li>\n<li>\n<p><code>&lt;resource&gt;</code> defines the resource descriptors for deploying on an OpenShift or Kuberneres cluster.</p>\n</li>\n<li>\n<p><code>&lt;generator&gt;</code> configures <a href=\"#generators\">generators</a> which are responsible for creating images. Generators are used as an alternative to a dedicated <code>&lt;images&gt;</code> section.</p>\n</li>\n<li>\n<p><code>&lt;enricher&gt;</code> configures various aspects of <a href=\"#enrichers\">enrichers</a> for creating or enhancing resource descriptors.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>A working example can be found in the\n<a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/xml-config\">quickstarts/maven/xml-config</a> directory.\nAn extract of the plugin configuration is shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for an XML configuration</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;namespace&gt;test-ns&lt;/namespace&gt;\n &lt;images&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;image&gt;\n &lt;name&gt;xml-config-demo:1.0.0&lt;/name&gt;\n &lt;!-- \"alias\" is used to correlate to the containers in the pod spec --&gt;\n &lt;alias&gt;camel-app&lt;/alias&gt;\n &lt;build&gt;\n &lt;from&gt;fabric8/java-centos-openjdk8-jre&lt;/from&gt;\n &lt;assembly&gt;\n &lt;inline&gt;\n &lt;baseDirectory&gt;/deployments&lt;/baseDirectory&gt;\n &lt;/inline&gt;\n &lt;/assembly&gt;\n &lt;env&gt;\n &lt;JAVA_LIB_DIR&gt;/deployments&lt;/JAVA_LIB_DIR&gt;\n &lt;JAVA_MAIN_CLASS&gt;org.apache.camel.cdi.Main&lt;/JAVA_MAIN_CLASS&gt;\n &lt;/env&gt;\n &lt;/build&gt;\n &lt;/image&gt;\n &lt;/images&gt;\n\n &lt;resources&gt; <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n &lt;labels&gt; <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n &lt;all&gt;\n &lt;group&gt;quickstarts&lt;/group&gt;\n &lt;/all&gt;\n &lt;/labels&gt;\n\n &lt;replicas&gt;2&lt;/replicas&gt; <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n &lt;controllerName&gt;${project.artifactId}&lt;/controllerName&gt; <i class=\"conum\" data-value=\"5\"></i><b>(5)</b>\n\n &lt;services&gt; <i class=\"conum\" data-value=\"6\"></i><b>(6)</b>\n &lt;service&gt;\n &lt;name&gt;camel-service&lt;/name&gt;\n &lt;headless&gt;true&lt;/headless&gt;\n &lt;/service&gt;\n &lt;/services&gt;\n\n &lt;serviceAccounts&gt;\n &lt;serviceAccount&gt;\n &lt;name&gt;build-robot&lt;/name&gt;\n &lt;/serviceAccount&gt;\n &lt;/serviceAccounts&gt;\n &lt;/resources&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Standard XML configuration for building one single Docker image</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td>Kubernetes / OpenShift resources to create</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td>Labels which should be applied globally to all resource objects</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td>Number of replicas desired</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"5\"></i><b>5</b></td>\n<td>Name of controller created by plugin</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"6\"></i><b>6</b></td>\n<td>One or more <a href=\"http://kubernetes.io/docs/user-guide/services/\">Service</a> definitions.</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>The XML resource configuration is based on plain Kubernetes resource objects. When targeting OpenShift, Kubernetes resource descriptors will be automatically converted to their OpenShift counterparts, e.g. a Kubernetes <a href=\"http://kubernetes.io/docs/user-guide/deployments/\">Deployment</a> will be converted to an OpenShift <a href=\"https://docs.openshift.com/container-platform/4.1/applications/deployments/what-deployments-are.html#deployments-and-deploymentconfigs_what-deployments-are\">DeploymentConfig</a>.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_resource_fragments\">1.4.3. Resource Fragments</h4>\n<div class=\"paragraph\">\n<p>The third configuration option is to use an external configuration in form of YAML resource descriptors which are located in the <code>src/main/jkube</code> directory. Each resource gets its own file, which contains a skeleton of a resource descriptor. The plugin will pick up the resource, enrich it and then combine all to a single <code>kubernetes.yml</code> and <code>openshift.yml</code> file. Within these descriptor files you are can freely use any Kubernetes feature.</p>\n</div>\n<div class=\"paragraph\">\n<p>Note: In order to support simultaneously both OpenShift and Kubernetes, there is currently no way to specify OpenShift-only features this way, though this might change in future releases.</p>\n</div>\n<div class=\"paragraph\">\n<p>Let&#8217;s have a look at an example from\n<a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/external-resources\">quickstarts/maven/external-resources</a>.\nThis is a plain Spring Boot application, whose images are auto generated like in the <a href=\"#zero-config\">Zero-Config</a> case.\nThe resource fragments are in <code>src/main/jkube</code>.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example fragment \"deployment.yml\"</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n replicas: 1\n template:\n spec:\n volumes:\n - name: config\n gitRepo:\n repository: 'https://github.com/jstrachan/sample-springboot-config.git'\n revision: 667ee4db6bc842b127825351e5c9bae5a4fb2147\n directory: .\n containers:\n - volumeMounts:\n - name: config\n mountPath: /app/config\n env:\n - name: KUBERNETES_NAMESPACE\n valueFrom:\n fieldRef:\n apiVersion: v1\n fieldPath: metadata.namespace\n serviceAccount: ribbon</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>As you can see, there is no <code>metadata</code> section as would be expected for Kubernetes resources because it will be automatically added by the <code>openshift-maven-plugin</code>. The object&#8217;s <code>Kind</code>, if not given, is automatically derived from the\nfilename. In this case, the <code>openshift-maven-plugin</code> will create a <code>Deployment</code> because the file is called <code>deployment.yml</code>. Similar mappings between file names and resource type exist for each supported resource kind, the\ncomplete list of which (along with associated abbreviations) can be found in the <a href=\"#appendix-kind-mapping\">Appendix</a>.</p>\n</div>\n<div class=\"admonitionblock note\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-note\" title=\"Note\"></i>\n</td>\n<td class=\"content\">\nNow that sidecar containers are supported in this plugin(if <code>jkube.sidecar</code> is enabled), be careful whenever you&#8217;re supplying container name in the resource fragment. If container specified in resource fragment doesn&#8217;t have a name or it&#8217;s name is equal to default fmp generated application&#8217;s container name; it would not be treated as sidecar and it would be merged into main container. However, You can override plugin&#8217;s default name for main container via <code>jkube.generator.alias</code> property.\n</td>\n</tr>\n</table>\n</div>\n<hr>\n<div class=\"paragraph\">\n<p>Additionally, if you name your fragment using a name prefix followed by a dash and the mapped file name, the plugin will automatically use that name for your resource. So, for example, if you name your deployment fragment\n<code>myapp-deployment.yml</code>, the plugin will name your resource <code>myapp</code>. In the absence of such provided name for your resource, a name will be automatically derived from your project&#8217;s metadata (in particular, its <code>artifactId</code> as specified in your POM).</p>\n</div>\n<div class=\"paragraph\">\n<p>No image is also referenced in this example because the plugin also fills in the image details based on the configured image you are building with (either from a generator or from a dedicated image plugin configuration, as seen before).</p>\n</div>\n<div class=\"admonitionblock note\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-note\" title=\"Note\"></i>\n</td>\n<td class=\"content\">\nFor building images there is also an alternative mode using external Dockerfiles, in addition to the XML based configuration. Refer to <a href=\"#build-overview\">oc:build</a> for details.\n</td>\n</tr>\n</table>\n</div>\n<hr>\n<div class=\"paragraph\">\n<p>Enrichment of resource fragments can be fine-tuned by using profile sub-directories. For more details see <a href=\"#profiles\">Profiles</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Now that we have seen some examples of the various ways how this plugin can be used, the following sections will describe the plugin goals and extension points in detail.</p>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"compatibility-with-OpenShift\">2. Compatibility with OpenShift</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"openshift-compatibility\">2.1. OpenShift Compatibility</h3>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 2. OpenShift Compatibility</caption>\n<colgroup>\n<col style=\"width: 25%;\">\n<col style=\"width: 25%;\">\n<col style=\"width: 25%;\">\n<col style=\"width: 25%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">OMP</th>\n<th class=\"tableblock halign-left valign-top\">OpenShift 4.4</th>\n<th class=\"tableblock halign-left valign-top\">OpenShift 4.2</th>\n<th class=\"tableblock halign-left valign-top\">OpenShift 3.11</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 1.0.0-rc-1</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 1.0.0-alpha-4</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 1.0.0-alpha-3</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 1.0.0-alpha-2</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 1.0.0-alpha-1</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 0.2.0</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 0.1.1</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OMP 0.1.0</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">✓</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"installation\">3. Installation</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>This plugin is available from Maven central and can be connected to\npre- and post-integration phase as seen below. The configuration and\navailable goals are described below.</p>\n</div>\n<div class=\"paragraph\">\n<p>By default, Maven will only search for plugins in the <code>org.apache.maven.plugins</code> and <code>org.codehaus.mojo</code> packages. In order to resolve the provider for the JKube plugin goals, you need to edit <code>~/.m2/settings.xml</code> and add the <code>org.eclipse.jkube</code> namespace so the <code>&lt;pluginGroups&gt;</code> configuration.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;settings&gt;\n ...\n\n &lt;pluginGroups&gt;\n &lt;pluginGroup&gt;org.eclipse.jkube&lt;/pluginGroup&gt;\n &lt;/pluginGroups&gt;\n\n ...\n&lt;/settings&gt;</code></pre>\n</div>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n\n &lt;configuration&gt;\n ....\n &lt;images&gt;\n &lt;!-- A single's image configuration --&gt;\n &lt;image&gt;\n ...\n &lt;build&gt;\n ....\n &lt;/build&gt;\n &lt;/image&gt;\n ....\n &lt;/images&gt;\n &lt;/configuration&gt;\n\n &lt;!-- Connect oc:resource, oc:build and oc:helm to lifecycle phases --&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"goals\">4. Goals Overview</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>This plugin supports a rich set for providing a smooth Java developer experience. These goals can be categorized in multiple groups:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"#goals-build\">Build goals</a> are all about creating and managing Kubernetes build artifacts like Docker images or S2I builds.</p>\n</li>\n<li>\n<p><a href=\"#goals-develop\">Development goals</a> target help not only in deploying resource descriptors to the development cluster but also to manage the lifecycle of the development cluster as well.</p>\n</li>\n</ul>\n</div>\n<table id=\"goals-build\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 3. Build Goals</caption>\n<colgroup>\n<col style=\"width: 25%;\">\n<col style=\"width: 75%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Goal</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:build\"><strong>oc:build</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Build images</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:push\"><strong>oc:push</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Push images to a registry</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:resource\"><strong>oc:resource</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Create Kubernetes or OpenShift resource descriptors</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:apply\"><strong>oc:apply</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Apply resources to a running cluster</p></td>\n</tr>\n</tbody>\n</table>\n<table id=\"goals-develop\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 4. Development Goals</caption>\n<colgroup>\n<col style=\"width: 25%;\">\n<col style=\"width: 75%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Goal</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:deploy\"><strong>oc:deploy</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Deploy resources descriptors to a cluster after creating them and building the app. Same as <a href=\"#jkube:apply\"><strong>oc:apply</strong></a> except that it runs in the background.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:undeploy\"><strong>oc:undeploy</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Undeploy and remove resources descriptors from a cluster.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:watch\"><strong>oc:watch</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Watch for file changes and perform rebuilds and redeployments</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:log\"><strong>oc:log</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Show the logs of the running application</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong><a href=\"#jkube:debug\"><strong>oc:debug</strong></a></strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Enable remote debugging</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Depending on whether the OpenShift or Kubernetes operational mode is used, the workflow and the performed actions differs :</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 5. Workflows</caption>\n<colgroup>\n<col style=\"width: 11.1111%;\">\n<col style=\"width: 44.4444%;\">\n<col style=\"width: 44.4445%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Use Case</th>\n<th class=\"tableblock halign-left valign-top\">Kubernetes</th>\n<th class=\"tableblock halign-left valign-top\">OpenShift</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Build</p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p><code>oc:build</code> <code>oc:push</code></p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Creates an image against an exposed Docker daemon (with a <code>docker.tar</code>)</p>\n</li>\n<li>\n<p>Pushes the image to a registry which is then referenced from the configuration</p>\n</li>\n</ul>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p><code>oc:build</code></p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Creates or uses a <code>BuildConfig</code></p>\n</li>\n<li>\n<p>Creates or uses an <code>ImageStream</code> which can be referenced by the deployment descriptors in a <code>DeploymenConfig</code></p>\n</li>\n<li>\n<p>Starts an OpenShift build with a <code>docker.tar</code> as input</p>\n</li>\n</ul>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Deploy</p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p><code>oc:deploy</code></p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Applies a Kubernetes resource descriptor to cluster</p>\n</li>\n</ul>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p><code>oc:deploy</code></p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Applies an OpenShift resource descriptor to a cluster</p>\n</li>\n</ul>\n</div></div></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"goals-overview-build\">5. Build Goals</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"jkube:resource\">5.1. <strong>oc:resource</strong></h3>\n<div class=\"paragraph\">\n<p>This goal generates Kubernetes resources based on your project. It can either be opinionated defaults or\nbased on the configuration provided in XML config or resource fragments in <code>src/main/jkube</code>.\nGenerated resources are in <code>target/classes/META-INF/jkube/openshift</code> directory.</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"resource-labels-annotations\">5.1.1. Labels and Annotations</h4>\n<div class=\"paragraph\">\n<p>Labels and annotations can be easily added to any resource object. This is best explained by an example.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for label and annotations</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;!-- ... --&gt;\n &lt;configuration&gt;\n &lt;!-- ... --&gt;\n &lt;resources&gt;\n &lt;labels&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;all&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;property&gt; <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n &lt;name&gt;organisation&lt;/name&gt;\n &lt;value&gt;unesco&lt;/value&gt;\n &lt;/property&gt;\n &lt;/all&gt;\n &lt;service&gt; <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n &lt;property&gt;\n &lt;name&gt;database&lt;/name&gt;\n &lt;value&gt;mysql&lt;/value&gt;\n &lt;/property&gt;\n &lt;property&gt;\n &lt;name&gt;persistent&lt;/name&gt;\n &lt;value&gt;true&lt;/value&gt;\n &lt;/property&gt;\n &lt;/service&gt;\n &lt;replicaSet&gt; <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n &lt;!-- ... --&gt;\n &lt;/replicaSet&gt;\n &lt;pod&gt; <i class=\"conum\" data-value=\"5\"></i><b>(5)</b>\n &lt;!-- ... --&gt;\n &lt;/pod&gt;\n &lt;deployment&gt; <i class=\"conum\" data-value=\"6\"></i><b>(6)</b>\n &lt;!-- ... --&gt;\n &lt;/deployment&gt;\n &lt;/labels&gt;\n\n &lt;annotations&gt; <i class=\"conum\" data-value=\"7\"></i><b>(7)</b>\n &lt;!-- ... --&gt;\n &lt;/annotations&gt;\n &lt;remotes&gt; <i class=\"conum\" data-value=\"8\"></i><b>(8)</b>\n &lt;remote&gt;https://gist.githubusercontent.com/lordofthejars/ac2823cec7831697d09444bbaa76cd50/raw/e4b43f1b6494766dfc635b5959af7730c1a58a93/deployment.yaml&lt;/remote&gt;\n &lt;/remotes&gt;\n &lt;/resource&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td><code>&lt;labels&gt;</code> section with <code>&lt;resources&gt;</code> contains labels which should be applied to objects of various kinds</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td>Within <code>&lt;all&gt;</code> labels which should be applied to <strong>every</strong> object can be specified</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td><code>&lt;service&gt;</code> labels are used to label services</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td><code>&lt;replicaSet&gt;</code> labels are for replica set and replication controller</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"5\"></i><b>5</b></td>\n<td><code>&lt;pod&gt;</code> holds labels for pod specifications in replication controller, replica sets and deployments</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"6\"></i><b>6</b></td>\n<td><code>&lt;deployment&gt;</code> is for labels on deployments (kubernetes) and deployment configs (openshift)</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"7\"></i><b>7</b></td>\n<td>The subelements are also available for specifying annotations.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"8\"></i><b>8</b></td>\n<td><code>&lt;remotes&gt;</code> you can set location of fragments as <code>URL</code>.</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>Labels and annotations can be specified in free form as a map. In this map, the element name is the name of the label or annotation respectively, whereas the content is the value to set.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following subelements are possible for <code>&lt;labels&gt;</code> and <code>&lt;annotations&gt;</code> :</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 6. Label and annotation configuration</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>all</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">All entries specified in the <code>&lt;all&gt;</code> sections are applied to all resource objects created.\n This also implies build object like image stream and build configs which are created implicitly for an <a href=\"#build-openshift\">Kubernetes build</a>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>deployment</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Labels and annotations applied to <code>Deployment</code> (for Kubernetes).\n And <code>DeploymentConfig</code> (for OpenShift) objects.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pod</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Labels and annotations applied pod specification as used in <code>ReplicationController</code>, <code>ReplicaSets</code>, <code>Deployments</code> and <code>DeploymentConfigs</code> objects.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>replicaSet</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Labels and annotations applied to <code>ReplicaSet</code> and <code>ReplicationController</code> objects.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>service</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Labels and annotations applied to <code>Service</code> objects.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"resource-secrets\">5.1.2. Secrets</h4>\n<div class=\"paragraph\">\n<p>Once you&#8217;ve configured some docker registry credentials into <code>~/.m2/setting.xml</code>, as explained in the\n<a href=\"#authentication\">Authentication</a> section, you can create Kubernetes secrets from a server declaration.</p>\n</div>\n<div class=\"paragraph\">\n<p><strong>XML configuration</strong></p>\n</div>\n<div class=\"paragraph\">\n<p>You can create a secret using xml configuration in the <code>pom.xml</code> file. It should contain the following fields:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">key</th>\n<th class=\"tableblock halign-left valign-top\">required</th>\n<th class=\"tableblock halign-left valign-top\">description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>dockerServerId</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>true</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">the server id which is configured in\n<code>~/.m2/setting.xml</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>true</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">this will be used as name of the kubernetes secret resource</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>namespace</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>false</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">the secret resource will be applied to the specific\nnamespace, if provided</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>This is best explained by an example.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for XML configuration</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;properties&gt;\n &lt;jkube.docker.registry&gt;docker.io&lt;/docker.registry&gt;\n&lt;/properties&gt;</code></pre>\n</div>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;resources&gt;\n &lt;secrets&gt;\n &lt;secret&gt;\n &lt;dockerServerId&gt;${docker.registry}&lt;/dockerServerId&gt;\n &lt;name&gt;mydockerkey&lt;/name&gt;\n &lt;/secret&gt;\n &lt;/secrets&gt;\n &lt;/resources&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p><strong>Yaml fragment with annotation</strong></p>\n</div>\n<div class=\"paragraph\">\n<p>You can create a secret using a yaml fragment. You can reference the docker server id with an annotation\n<code>maven.jkube.io/dockerServerId</code>. The yaml fragment file should be put under\nthe <code>src/main/jkube/</code> folder.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: v1\nkind: Secret\nmetadata:\n name: mydockerkey\n namespace: default\n annotations:\n maven.jkube.io/dockerServerId: ${docker.registry}\ntype: kubernetes.io/dockercfg</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"resource-validation\">5.1.3. Resource Validation</h4>\n<div class=\"paragraph\">\n<p>Resource goal also validates the generated resource descriptors using API specification of <a href=\"https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json\">Kubernetes</a>.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 7. Validation Configuration</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipResourceValidation</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If value is set to <code>true</code> then resource validation is skipped. This may be useful if resource validation is failing\n for some reason but you still want to continue the deployment.</p>\n<p class=\"tableblock\"> Default is <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skipResourceValidation</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>failOnValidationError</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If value is set to <code>true</code> then any validation error will block the plugin execution. A warning will be printed\n otherwise.</p>\n<p class=\"tableblock\"> Default is <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.failOnValidationError</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"resource-route-generation\">5.1.4. Route Generation</h4>\n<div class=\"paragraph\">\n<p>When the <code>oc:resource</code> goal is run, an Kubernetes\n<a href=\"https://docs.openshift.org/latest/architecture/networking/routes.html\">Route</a> descriptor (<code>route.yml</code>) will also be\ngenerated along the service if an Kubernetes cluster is targeted.\nIf you do not want to generate a Route descriptor, you can set the <code>jkube.openshift.generateRoute</code> property to <code>false</code>.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 8. Route Generation Configuration</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>generateRoute</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If value is set to <code>false</code> then no Route descriptor will be generated.\n By default it is set to <code>true</code>, which will create a <code>route.yml</code> descriptor and also add Route resource to <code>openshift.yml</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.generateRoute</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-openshift-route.generateRoute</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>If you do not want to generate a Route descriptor, you can also specify so in the plugin configuration in your POM as seen below.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for not generating route resource by configuring it in <code>pom.xml</code></div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-openshift-route&gt;\n &lt;generateRoute&gt;false&lt;/generateRoute&gt;\n &lt;/jkube-openshift-route&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If you are using resource fragments, then also you can configure it in your Service resource fragment (e.g. <code>service.yml</code>).\nYou need to add an <code>expose</code> label to the <code>metadata</code> section of your service and set it to <code>false</code>.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for not generating route resource by configuring it in resource fragments</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">metadata:\n annotations:\n api.service.kubernetes.io/path: /hello\n labels:\n expose: \"false\"\nspec:\n type: LoadBalancer</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"Supported-Properties-Resource\">5.1.5. Supported Properties for Resource goal</h4>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 9. Options available with resource goal</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>enableAutomaticTrigger</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If the value is set to <code>false</code> then automatic deployments would be disabled.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.enableAutomaticTrigger</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>deployTimeoutSeconds</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The OpenShift deploy timeout in seconds.</p>\n<p class=\"tableblock\"> Defaults to <code>3600</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.deployTimeoutSeconds</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>imageChangeTriggers</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add ImageChange triggers to DeploymentConfigs when on openshift.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.imageChangeTriggers</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>trimImageInContainerSpec</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to true it would set the container image reference to \"\", this is done to handle weird behavior of OpenShift\n 3.7 in which subsequent rollouts lead to ImagePullErr.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.trimImageInContainerSpec</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>enrichAllWithImageChangeTrigger</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Adds ImageChangeTriggers with respect to all containers specified inside DeploymentConfig.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshift.enrichAllWithImageChangeTrigger</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>profile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Profile to use. A profile contains the enrichers and generators to use as well as their configuration. Profiles are\n looked up in the classpath and can be provided as yaml files.</p>\n<p class=\"tableblock\"> Defaults to <code>default</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.profile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>sidecar</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Whether to enable sidecar behavior or not. By default pod specs are merged into main application container.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.sidecar</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipHealthCheck</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Whether to skip health checks addition in generated resources or not.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skipHealthCheck</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>workDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The JKube working directory. Defaults to <code>${project.build.directory}/jkube</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.workDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>environment</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Environment name where resources are placed. For example, if you set this property to dev and resourceDir is the\n default one, plugin will look at <code>src/main/jkube/dev</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>null</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.environment</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>useProjectClassPath</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we use the project&#8217;s compile time classpath to scan for additional enrichers/generators.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.useProjectClassPath</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>resourceDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Folder where to find project specific files.</p>\n<p class=\"tableblock\"> Defaults to <code>${basedir}/src/main/jkube</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.resourceDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>targetDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The generated Kubernetes manifests target direcotry.</p>\n<p class=\"tableblock\"> Defaults to <code>${project.build.outputDirectory}/META-INF/jkube</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.targetDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>resourceType</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The artifact type for attaching the generated resource file to the project. Can be either 'json' or 'yaml'.</p>\n<p class=\"tableblock\"> Defaults to <code>yaml</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.resourceType</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>mergeWithDekorate</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">When resource generation is delegated to Dekorate, should JKube resources be merged with Dekorate generated ones.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.mergeWithDekorate</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipResource</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Skip resource generation.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.resource</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>createExternalUrls</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we create external Ingress for any LoadBalancer Services which don&#8217;t already have them.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.createExternalUrls</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>domain</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Domain added to the Service ID when creating Kubernetes Ingresses or OpenShift routes.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.domain</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:build\">5.2. <strong>oc:build</strong></h3>\n<div class=\"paragraph\">\n<p>This goal is for building Docker images.</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-kubernetes\">5.2.1. Kubernetes Build</h4>\n<div class=\"paragraph\">\n<p>A normal Docker build is performed by default. The connection configuration to\naccess the Docker daemon is described in <a href=\"#access-configuration\">Access Configuration</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>In order to make the generated images available to the Kubernetes cluster the generated images need to be pushed to a\nregistry with the goal <a href=\"#jkube:push\"><strong>oc:push</strong></a>. This is not necessary for single node clusters, though as there is no need to\ndistribute images.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-openshift\">5.2.2. OpenShift Build</h4>\n<div class=\"paragraph\">\n<p>For the <code>openshift</code> mode, OpenShift specific\n<a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html\">builds</a> will be\nperformed. These are so called\n<a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html\">Binary Source</a>\nbuilds (\"binary builds\" in short), where the data specified with the <a href=\"#build-configuration\">build configuration</a> is\nsent directly to OpenShift as a binary archive.</p>\n</div>\n<div class=\"paragraph\">\n<p>There are two kind of binary builds supported by this plugin, which can be selected with the <code>buildStrategy</code> configuration option (<code>jkube.build.strategy</code> property)</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 10. Build Strategies</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\"><code>buildStrategy</code></th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The <a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#source-build\">Source-to-Image</a> (S2I) build strategy uses so called builder images for creating new application images from binary build data. The builder image to use is taken from the base image configuration specified with <a href=\"#build-config-from\">from</a> in the image build configuration. See below for a list of builder images which can be used with this plugin.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>docker</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A <a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#docker-build\">Docker Build</a> is similar to a normal Docker build except that it is done by the OpenShift cluster and not by a Docker daemon. In addition this build pushes the generated image to the OpenShift internal registry so that it is accessbile in the whole cluster.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Both build strategies update an\n<a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#image-streams\">Image Stream</a>\nafter the image creation.</p>\n</div>\n<div class=\"paragraph\">\n<p>The <a href=\"https://docs.openshift.com/enterprise/latest/dev_guide/builds.html#defining-a-buildconfig\">Build Config</a> and\n<a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#image-streams\">Image streams</a>\ncan be managed by this plugin. If they do not exist, they will be automatically created by <code>oc:build</code>.\nIf they do already exist, they are reused, except when the <code>buildRecreate</code> configuration option\n(property <code>jkube.build.recreate</code>) is set to a value as described in <a href=\"#build-goal-configuration\">Configuration</a>.\nAlso if the provided build strategy is different than the one defined in the existing build configuration, the Build\nConfig is edited to reflect the new type (which in turn removes all build associated with the previous build).</p>\n</div>\n<div class=\"paragraph\">\n<p>This image stream created can then be directly referenced from\n<a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/deployments.html#deployments-and-deployment-configurations\">Deployment Configuration</a>\nobjects created by <a href=\"#jkube:resource\"><strong>oc:resource</strong></a>.\nBy default, image streams are created with a local lookup policy, so that they can be used also by other resources such\nas Deployments or StatefulSets.\nThis behavior can be turned off by setting the <code>jkube.s2i.imageStreamLookupPolicyLocal</code> property to <code>false</code> when building\nthe project.</p>\n</div>\n<div class=\"paragraph\">\n<p>In order to be able to create these OpenShift resource objects access to an OpenShift installation is required.\nThe access parameters are described in <a href=\"#access-configuration\">Access Configuration</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Regardless of which build mode is used, the images are configured in the same way.</p>\n</div>\n<div class=\"paragraph\">\n<p>The configuration consists of two parts:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>a global section which defines the overall behaviour of this plugin</p>\n</li>\n<li>\n<p>and an <code>&lt;images&gt;</code> section which defines how the images should be build</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Many of the options below are relevant for the <a href=\"#build-kubernetes\">Kubernetes Workflow</a> or the <a href=\"#build-openshift\">OpenShift Workflow</a> with Docker builds as they influence how the Docker image is build.</p>\n</div>\n<div class=\"paragraph\">\n<p>For an S2I binary build, on the other hand, the most relevant section is the <a href=\"#build-assembly\">Assembly</a> one because the build depends on which buider/base image is used and how it interprets the content of the uploaded <code>docker.tar</code>.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-goal-configuration\">5.2.3. Configuration (XML)</h4>\n<div class=\"paragraph\">\n<p>The following sections describe the usual configuration, which is similar to the build configuration used in the\n <a href=\"https://dmp.fabric8.io\">docker-maven-plugin</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>In addition a more automatic way for creating predefined build configuration can be performed with so called <a href=\"#generators\">Generators</a>. Generators are very flexible and can be easily created. These are described in an extra <a href=\"#generators\">section</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Global configuration parameters specify overall behavior common for all images to build. Some of the configuration options are shared with other goals.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 11. Global configuration</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 71.4285%;\">\n<col style=\"width: 14.2858%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>buildStrategy</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Defines what build strategy to choose while building container image.\nPossible values are <code>docker</code> and <code>jib</code> out of which <code>docker</code> is default.</p>\n</div>\n<div class=\"paragraph\">\n<p>If the effective <a href=\"#build-mode\">mode</a> is <code>openshift</code> an additional <code>s2i</code> option is available\nand selected by default.</p>\n</div>\n<div class=\"paragraph\">\n<p>Available strategies for OpenShift are:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>s2i</code> for a <a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#source-build\">Source-to-Image build</a> with a binary source</p>\n</li>\n<li>\n<p><code>docker</code> for a <a href=\"https://docs.openshift.com/enterprise/latest/architecture/core_concepts/builds_and_image_streams.html#docker-build\">Docker build</a> with a binary source</p>\n</li>\n</ul>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.strategy</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>apiVersion</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Use this variable if you are using an older version of docker not compatible with the current default use to\n communicate with the server.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.apiVersion</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>authConfig</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Authentication information when pulling from or pushing to Docker registry. There is a dedicated section\n <a href=\"#authentication\">Authentication</a> for how to do security.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>autoPull</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Decide how to pull missing base images or images to start:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>on</code> : Automatic download any missing images (default)</p>\n</li>\n<li>\n<p><code>off</code> : Automatic pulling is switched off</p>\n</li>\n<li>\n<p><code>always</code> : Pull images always even when they already exist locally</p>\n</li>\n<li>\n<p><code>once</code> : For multi-module builds images are only checked once and pulled for the whole build.</p>\n</li>\n</ul>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.autoPull</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>buildRecreate</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>If the effective <a href=\"#build-mode\">mode</a> is <code>openshift</code> then this option decides how the OpenShift resource objects\n associated with the build should be treated when they already exist:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>buildConfig</code> or <code>bc</code> : Only the BuildConfig is recreated</p>\n</li>\n<li>\n<p><code>imageStream</code> or <code>is</code> : Only the ImageStream is recreated</p>\n</li>\n<li>\n<p><code>all</code> : Both, BuildConfig and ImageStream are recreated</p>\n</li>\n<li>\n<p><code>none</code> : Neither BuildConfig nor ImageStream is recreated</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>The default is <code>none</code>. If you provide the property without value then <code>all</code> is assumed, so everything gets recreated.</p>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.recreate</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>forcePull</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Applicable only for OpenShift, S2I build strategy.</p>\n<p class=\"tableblock\">While creating a BuildConfig, By default, if the builder image specified in the\nbuild configuration is available locally on the node, that image will be used.</p>\n<p class=\"tableblock\">Using forcePull will override the local image and refresh it from the registry the image stream points to.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.forcePull</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a id=\"image-pull-policy\"></a> <strong>imagePullPolicy</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Specify whether images should be pull when looking for base images while building or images for starting.\nThis property can take the following values (case insensitive):</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>IfNotPresent</code>: Automatic download any missing images (default)</p>\n</li>\n<li>\n<p><code>Never</code> : Automatic pulling is switched off always</p>\n</li>\n<li>\n<p><code>Always</code> : Pull images always even when they already exist locally.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>By default a progress meter is printed out on the console, which is omitted when using Maven in batch mode (option <code>-B</code>). A very simplified progress meter is provided when using no color output (i.e. with <code>-Djkube.useColor=false</code>).</p>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.imagePullPolicy</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>certPath</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Path to SSL certificate when SSL is used for communicating with the Docker daemon. These certificates are normally\n stored in <code>~/.docker/</code>. With this configuration the path can be set explicitly. If not set, the fallback is first\n taken from the environment variable <code>DOCKER_CERT_PATH</code> and then as last resort <code>~/.docker/</code>. The keys in this are\n expected with it standard names <code>ca.pem</code>, <code>cert.pem</code> and <code>key.pem</code>.\n Please refer to the <a href=\"https://docs.docker.com/articles/https\">Docker documentation</a> for more information about SSL\n security with Docker.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.certPath</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>dockerHost</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>The URL of the Docker Daemon. If this configuration option is not given, then the optional <code>&lt;machine&gt;</code> configuration\nsection is consulted. The scheme of the URL can be either given directly as <code>http</code> or <code>https</code>\ndepending on whether plain HTTP communication is enabled or SSL should\nbe used. Alternatively the scheme could be <code>tcp</code> in which case the\nprotocol is determined via the IANA assigned port: 2375 for <code>http</code>\nand 2376 for <code>https</code>. Finally, Unix sockets are supported by using\nthe scheme <code>unix</code> together with the filesystem path to the unix socket.</p>\n</div>\n<div class=\"paragraph\">\n<p>The discovery sequence used by the docker-maven-plugin to determine\nthe URL is:</p>\n</div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>\n<p>Value of <strong>dockerHost</strong> (<code>jkube.docker.host</code>)</p>\n</li>\n<li>\n<p>The Docker host associated with the docker-machine named in <code>&lt;machine&gt;</code>, i.e. the <code>DOCKER_HOST</code> from <code>docker-machine env</code>. See <a href=\"#docker-machine\">below</a> for more information about Docker machine support.</p>\n</li>\n<li>\n<p>The value of the environment variable <code>DOCKER_HOST</code>.</p>\n</li>\n<li>\n<p><code>unix:///var/run/docker.sock</code> if it is a readable socket.</p>\n</li>\n</ol>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.host</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>filter</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">In order to temporarily restrict the operation of plugin goals this configuration option can be used.\n Typically this will be set via the system property <code>jkube.image.filter</code> when Maven is called. The value can be a single\n image name (either its alias or full name) or it can be a comma separated list with multiple image names. Any name\n which doesn&#8217;t refer an image in the configuration will be ignored.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.image.filter</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>machine</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Docker machine configuration. See <a href=\"#docker-machine\">Docker Machine</a> for possible values.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>maxConnections</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Number of parallel connections are allowed to be opened to the Docker Host. For parsing log output, a connection needs\n to be kept open (as well for the wait features), so don&#8217;t put that number to low. Default is 100 which should be\n suitable for most of the cases.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.maxConnections</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>access</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Group of configuration parameters to connect to Kubernetes/OpenShift cluster.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>outputDirectory</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Default output directory to be used by this plugin.\n The default value is <code>target/docker</code> and is only used for the goal <code>oc:build</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.target.dir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>profile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Profile to which contains enricher and generators configuration. See <a href=\"#profiles\">Profiles</a> for details.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.profile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pullSecret</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name to use for naming pullSecret to be created to pull the base image in case pulling from a private registry\n which requires authentication for OpenShift.</p>\n<p class=\"tableblock\"> The default value for pull registry will be picked from <code>jkube.docker.pull.registry</code>/<code>jkube.docker.registry</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.pullSecret</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>registry</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Specify globally a registry to use for pulling and pushing images. See <a href=\"#registry\">Registry handling</a> for details.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.registry</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skip</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">With this parameter the execution of this plugin can be skipped completely.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipBuild</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set not images will be build (which implies also <em>skip.tag</em>) with <code>oc:build</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.build</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipBuildPom</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set the build step will be skipped for modules of type <code>pom</code>. If not set, then by default projects of type <code>pom</code>\n will be skipped if there are no image configurations contained.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.build.pom</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipTag</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code> this plugin won&#8217;t add any tags to images that have been built with <code>oc:build</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.tag</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipMachine</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Skip using docker machine in any case</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.skip.machine</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>sourceDirectory</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Default directory that contains the assembly descriptor(s) used by the plugin. The default value is <code>src/main/docker</code>.\n This option is only relevant for the <code>oc:build</code> goal.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.build.source.dir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>verbose</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Boolean attribute for switching on verbose output like the build steps when doing a Docker build. Default is <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.verbose</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>logDate</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The date format to use when logging messages from Docker. Default is <code>DEFAULT</code> (<code>HH:mm:ss.SSS</code>)</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.logDate</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>logStdout</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Log to stdout regardless if log files are configured or not. Default is <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.logStdout</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_kubernetes_access_configuration\">5.2.4. Kubernetes Access Configuration</h4>\n<div class=\"paragraph\">\n<p>You can configure parameters to define how plugin is going to connect to Kubernetes cluster instead of relying on default parameters.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;access&gt;\n &lt;username&gt;&lt;/username&gt;\n &lt;password&gt;&lt;/password&gt;\n &lt;masterUrl&gt;&lt;/masterUrl&gt;\n &lt;apiVersion&gt;&lt;/apiVersion&gt;\n &lt;/access&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 71.4285%;\">\n<col style=\"width: 14.2858%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>username</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Username on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.username</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>password</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Password on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.password</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>namespace</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Namespace on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.namespace</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>masterUrl</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Master URL on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.masterUrl</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>apiVersion</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Api version on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.apiVersion</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>caCertFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">CaCert File on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.caCertFile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>caCertData</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">CaCert Data on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.caCertData</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientCertFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Cert File on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientCertFile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientCertData</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Cert Data on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientCertData</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientKeyFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Key File on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientKeyFile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientKeyData</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Key Data on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientKeyData</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientKeyAlgo</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Key Algorithm on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientKeyAlgo</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>clientKeyPassphrase</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Client Key Passphrase on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.clientKeyPassphrase</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>trustStoreFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Trust Store File on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.trustStoreFile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>trustStorePassphrase</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Trust Store Passphrase on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.trustStorePassphrase</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keyStoreFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Key Store File on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.keyStoreFile</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keyStorePassphrase</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Key Store Passphrase on which to operate.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.keyStorePassphrase</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_image_configuration\">5.2.5. Image Configuration</h4>\n<div class=\"paragraph\">\n<p>The configuration how images should be created a defined in a dedicated <code>&lt;images&gt;</code> sections. These are specified for\neach image within the <code>&lt;images&gt;</code> element of the configuration with one <code>&lt;image&gt;</code> element per image to use.</p>\n</div>\n<div class=\"paragraph\">\n<p>The <code>&lt;image&gt;</code> element can contain the following sub elements:</p>\n</div>\n<table id=\"config-image\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 12. Image Configuration</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#image-name\"><strong>name</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Each <code>&lt;image&gt;</code> configuration has a mandatory, unique docker\nrepository <em>name</em>. This can include registry and tag parts, but also placeholder parameters. See below for a detailed explanation.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>alias</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Shortcut name for an image which can be used for\nidentifying the image within this configuration. This is used when\nlinking images together or for specifying it with the global <strong>image</strong> configuration element.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#registry\"><strong>registry</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Registry to use for this image. If the <code>name</code> already contains a registry this takes precedence. See <a href=\"#registry\">Registry handling</a> for more details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#config-image-build\"><strong>build</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Element which contains all the configuration aspects when doing a <a href=\"#jkube:build\"><strong>oc:build</strong></a>. This element can be omitted if the image is only pulled from a registry e.g. as support for integration tests like database images.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>The <code>&lt;build&gt;</code> section is mandatory and is explained in <a href=\"#build-configuration\">below</a>.</p>\n</div>\n<div id=\"image-name\" class=\"paragraph\">\n<p>When specifying the image name in the configuration with the <code>&lt;name&gt;</code> field you can use several placeholders which are replaced during runtime by this plugin. In addition you can use regular Maven properties which are resolved by Maven itself.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 13. Image Names</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Placeholder</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>%g</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The last part of the Maven group name, sanitized so that it can be used as username on GitHub. Only the part after the last dot is used. E.g. for a group id <code>org.eclipse.jkube</code> this placeholder would insert <code>jkube</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>%a</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A sanitized version of the artefact id so that it can be used as part of an Docker image name. I.e. it is converted to all lower case (as required by Docker)</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>%v</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The project version. Synonym to <code>${project.version}</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>%l</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If the project version ends with <code>-SNAPSHOT</code> then this placeholder is <code>latest</code>, otherwise its the full version (same as <code>%v</code>)</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>%t</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If the project version ends with <code>-SNAPSHOT</code> this placeholder resolves to <code>snapshot-&lt;timestamp&gt;</code> where timestamp has the date format <code>yyMMdd-HHmmss-SSSS</code> (eg <code>snapshot-</code>). This feature is especially useful during development in oder to avoid conflicts when images are to be updated which are still in use. You need to take care yourself of cleaning up old images afterwards, though.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"listingblock\">\n<div class=\"title\">Example for &lt;image&gt;</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;!-- .... --&gt;\n &lt;images&gt;\n &lt;image&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;name&gt;%g/jkube-build-demo:0.1&lt;/name&gt; <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n &lt;alias&gt;service&lt;/alias&gt; <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n &lt;build&gt;....&lt;/build&gt; <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n &lt;/image&gt;\n &lt;image&gt;\n ....\n &lt;/image&gt;\n &lt;/images&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>One or more <code>&lt;image&gt;</code> definitions</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td>The Docker image name used when creating the image. Note that <code>%g</code> would be replaced by project group id.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td>An alias which can be used in other parts of the plugin to reference to this image. This alias must be unique.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td>A <code>&lt;build&gt;</code> section as described in <a href=\"#buid-configuration\">Build Configuration</a></td>\n</tr>\n</table>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-configuration\">5.2.6. Build Configuration</h4>\n<div id=\"build-overview\" class=\"paragraph\">\n<p>There are two different modes how images can be built:</p>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Inline plugin configuration</div>\n<p>With an inline plugin configuration all information required to build the image is contained in the plugin configuration. By default its the standard XML based configuration for the plugin but can be switched to a property based configuration syntax as described in the section <a href=\"#external-configuration\">External configuration</a>. The XML configuration syntax is recommended because of its more structured and typed nature.</p>\n</div>\n<div class=\"paragraph\">\n<p>When using this mode, the Dockerfile is created on the fly with all instructions extracted from the configuration given.</p>\n</div>\n<div id=\"external-dockerfile\" class=\"paragraph\">\n<div class=\"title\">External Dockerfile or Docker archive</div>\n<p>Alternatively an external Dockerfile template or Docker archive can be used. This mode is switched on by using one of these three configuration options within</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><strong>contextDir</strong> specifies docker build context if an external dockerfile is located outside of Docker build context. If not specified, Dockerfile&#8217;s parent directory is used as build context.</p>\n</li>\n<li>\n<p><strong>dockerFile</strong> specifies a specific Dockerfile path. The Docker build context directory is set to <code>contextDir</code> if given. If not the directory by default is the directory in which the Dockerfile is stored.</p>\n</li>\n<li>\n<p><strong>dockerArchive</strong> specifies a previously saved image archive to load directly. If a <code>dockerArchive</code> is provided, no <code>dockerFile</code> must be given.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>All paths can be either absolute or relative paths. A relative path is looked up in <code>${project.basedir}/src/main/docker</code> by default. You can make it easily an absolute path by using <code>${project.basedir}</code> in your configuration.</p>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Adding assemblies in Dockerfile mode</div>\n<p>You can also use an assembly if specified in an <a href=\"#build-assembly\">assembly configuration</a>.\nHowever, you need to add the files on your own in the Dockerfile with an <code>ADD</code> or <code>COPY</code> command.\nThe files of the assembly are stored in a build context relative directory <code>maven/</code> but can be changed by changing the assembly name with the option <code>&lt;name&gt;</code> in the assembly configuration.</p>\n</div>\n<div class=\"paragraph\">\n<p>E.g. the files can be added with</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-dockerfile\" data-lang=\"dockerfile\">COPY maven/ /my/target/directory</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>so that the assembly files will end up in <code>/my/target/directory</code> within the container.</p>\n</div>\n<div class=\"paragraph\">\n<p>If this directory contains a <code>.maven-dockerignore</code> (or alternatively, a <code>.maven-dockerexclude</code> file), then it is used for excluding files for the build. Each line in this file is treated as a <a href=\"http://ant.apache.org/manual/Types/fileset.html\">FileSet exclude pattern</a> as used by the <a href=\"http://maven.apache.org/plugins/maven-assembly-plugin\">maven-assembly-plugin</a>. It is similar to <code>.dockerignore</code> when using Docker but has a slightly different syntax (hence the different name).\n<a href=\"#ex-build-dockerexclude\">Example <code>.maven-dockerexclude</code> or <code>.maven-dockerignore</code></a> is an example which excludes all compiled Java classes.</p>\n</div>\n<div id=\"ex-build-dockerexclude\" class=\"exampleblock\">\n<div class=\"title\">Example 1. Example <code>.maven-dockerexclude</code> or <code>.maven-dockerignore</code></div>\n<div class=\"content\">\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>target/classes/** <i class=\"conum\" data-value=\"1\"></i><b>(1)</b></code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Exclude all compiled classes</td>\n</tr>\n</table>\n</div>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If this directory contains a <code>.maven-dockerinclude</code> file, then it is used for including only those files for the build. Each line in this file is also treated as a <a href=\"http://ant.apache.org/manual/Types/fileset.html\">FileSet exclude pattern</a> as used by the <a href=\"http://maven.apache.org/plugins/maven-assembly-plugin\">maven-assembly-plugin</a>. <a href=\"#ex-build-dockerinclude\">Example <code>.maven-dockerinclude</code></a> shows how to include only jar file that have build to the Docker build context.</p>\n</div>\n<div id=\"ex-build-dockerinclude\" class=\"exampleblock\">\n<div class=\"title\">Example 2. Example <code>.maven-dockerinclude</code></div>\n<div class=\"content\">\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>target/*.jar <i class=\"conum\" data-value=\"1\"></i><b>(1)</b></code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Only add jar file to you Docker build context.</td>\n</tr>\n</table>\n</div>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Except for the <a href=\"#build-assembly\">assembly configuration</a> all other configuration options are ignored for now.</p>\n</div>\n<div id=\"simple-dockerfile-build\" class=\"paragraph\">\n<div class=\"title\">Simple Dockerfile build</div>\n<p>When only a single image should be built with a Dockerfile no XML configuration is needed at all.\nAll what need to be done is to place a <code>Dockerfile</code> into the top-level module directory, alongside to <code>pom.xml</code>.\nYou can still configure <a href=\"#global-configuration\">global aspects</a> in the plugin configuration, but as soon as you add an <code>&lt;image&gt;</code> in the XML configuration, you need to configure also the build explicitly.</p>\n</div>\n<div class=\"paragraph\">\n<p>The image name is by default set from the Maven coordinates (<code>%g/%a:%l</code>, see <a href=\"#image-name\">Image Name </a> for an explanation of the params which are essentially the Maven GAV)\nThis name can be set with the property <code>jkube.image.name</code>.</p>\n</div>\n<div id=\"build-filtering\" class=\"paragraph\">\n<div class=\"title\">Filtering</div>\n<p>openshift-maven-plugin filters given Dockerfile with Maven properties, much like the <code>maven-resource-plugin</code> does. Filtering is enabled by default and can be switched off with a build config <code>&lt;filter&gt;false&lt;/filter&gt;</code>. Properties which we want to replace are specified with the <code>${..}</code> syntax.\nReplacement includes Maven project properties such as <code>${project.artifactId}</code>, properties set in the build, command-line properties, and system properties. Unresolved properties remain untouched.</p>\n</div>\n<div class=\"paragraph\">\n<p>This partial replacement means that you can easily mix it with Docker build arguments and environment variable reference, but you need to be careful.\nIf you want to be more explicit about the property delimiter to clearly separate Docker properties and Maven properties you can redefine the delimiter.\nIn general, the <code>filter</code> option can be specified the same way as delimiters in the resource plugin.\nIn particular, if this configuration contains a * then the parts left, and right of the asterisks are used as delimiters.</p>\n</div>\n<div class=\"paragraph\">\n<p>For example, the default <code>&lt;filter&gt;${*}&lt;/filter&gt;</code> parse Maven properties in the format that we know.\nIf you specify a single character for <code>&lt;filter&gt;</code> then this delimiter is taken for both, the start and the end.\nE.g a <code>&lt;filter&gt;@&lt;/filter&gt;</code> triggers on parameters in the format <code>@&#8230;&#8203;@</code>, much like in the <code>maven-invoker-plugin</code>.\nUse something like this if you want to clearly separate from Docker builds args.\nThis form of property replacement works for Dockerfile only.\nFor replacing other data in other files targeted for the Docker image, please use the <code>maven-resource-plugin</code> or an <a href=\"#build-assembly\">assembly configuration</a> with filtering to make them available in the docker build context.</p>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Example</div>\n<p>The following example replaces all properties in the format <code>@property@</code> within the Dockerfile.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;configuration&gt;\n &lt;images&gt;\n &lt;image&gt;\n &lt;name&gt;user/demo&lt;/name&gt;\n &lt;build&gt;\n &lt;filter&gt;@&lt;/filter&gt;\n &lt;/build&gt;\n &lt;/image&gt;\n &lt;/images&gt;\n &lt;/configuration&gt;\n ...\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div id=\"build-plugin\" class=\"paragraph\">\n<div class=\"title\">Build Plugins</div>\n<p>This plugin supports so call <strong>dmp-plugins</strong> which are used during the build phase.\ndmp-plugins are enabled by just declaring a dependency in the plugin declaration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n\n &lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;run-java-sh&lt;/artifactId&gt;\n &lt;version&gt;1.2.2&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;/dependencies&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>org.eclipse.jkube.runsh.RunShLoader</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>During a build with <code>openshift-maven-plugin:build</code>, those classes are loaded and certain fixed method are called.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following methods are supported:</p>\n</div>\n<table id=\"build-plugin-methods\" class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Method</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>addExtraFiles</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A <em>static</em> method called by dmp with a single <code>File</code> argument. This will point to a directory <code>docker-extra</code> which can be referenced easily by a Dockerfile or an assembly. A dmp plugin typically will create an own subdirectory to avoid a clash with other dmp-plugins.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>If a configured plugin does not provide method of this name and signature, then it will be simply ignored.\nAlso, no interface needs to be implemented to keep the coupling low.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following official dmp-plugins are known and supported:</p>\n</div>\n<table id=\"build-plugins-official\" class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 71.4286%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Name</th>\n<th class=\"tableblock halign-left valign-top\">G,A</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"https://github.com/fabric8io-images/run-java-sh\">run-java.sh</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.io</code>, <code>run-java</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">General purpose startup script fo running Java applications. The dmp plugin creates a\n <code>target/docker-extra/run-java/run-java.sh</code> which can be included in a Dockerfile (see the example above).\n See the <a href=\"https://github.com/fabric8io-images/run-java-sh\">run-java.sh Documentation</a> for more details.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Check out <code>samples/run-java</code> for a fully working example.</p>\n</div>\n<div class=\"paragraph\">\n<p>All build relevant configuration is contained in the <code>&lt;build&gt;</code> section\nof an image configuration. The following configuration options are supported:</p>\n</div>\n<table id=\"config-image-build\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 14. Build configuration (<a href=\"#config-image\">&lt;image&gt; </a>)</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#config-image-build-assembly\"><strong>assembly</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Specifies the assembly configuration as described in <a href=\"#build-assembly\">Build Assembly</a></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#build-buildargs\"><strong>args</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Map specifying the value of <a href=\"https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables-build-arg\">Docker build args</a>\nwhich should be used when building the image with an external Dockerfile which uses build arguments. The key-value syntax is the same as when defining Maven properties (or <code>labels</code> or <code>env</code>).\nThis argument is ignored when no external Dockerfile is used. Build args can also be specified as properties as\ndescribed in <a href=\"#build-buildargs\">Build Args</a></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>buildOptions</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Map specifying the build options to provide to the docker daemon when building the image. These options map to the ones listed as query parameters in the\n<a href=\"https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#build-image-from-a-dockerfile\">Docker Remote API</a> and are restricted to simple options\n(e.g.: memory, shmsize). If you use the respective configuration options for build options natively supported by the build configuration (i.e. <code>noCache</code>, <code>cleanup=remove</code> for buildoption <code>forcerm=1</code> and <code>args</code> for build args) then these will override any corresponding options given here. The key-value syntax is the same as when defining environment variables or labels as described in <a href=\"#misc-env\">Setting Environment Variables and Labels</a>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>cleanup</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Cleanup dangling (untagged) images after each build (including any containers created from them). Default is <code>try</code> which tries to remove the old image, but doesn&#8217;t fail the build if this is not possible because e.g. the image is still used by a running container. Use <code>remove</code> if you want to fail the build and <code>none</code> if no cleanup is requested.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a id=\"context-dir\"></a><strong>contextDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Path to a directory used for the build&#8217;s context. You can specify the <code>Dockerfile</code> to use with <strong>dockerFile</strong>, which by default is the Dockerfile found in the <code>contextDir</code>. The Dockerfile can be also located outside of the <code>contextDir</code>, if provided with an absolute file path. See <a href=\"#external-dockerfile\">External Dockerfile</a> for details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#misc-startup\"><strong>cmd</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A command to execute by default (i.e. if no command is provided when a container for this image is started). See <a href=\"#misc-startup\">Startup Arguments</a> for details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>compression</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The compression mode how the build archive is transmitted to the docker daemon (<code>oc:build</code>) and how docker build archives are attached to this build as sources (<code>oc:source</code>). The value can be <code>none</code> (default), <code>gzip</code> or <code>bzip2</code>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>dockerFile</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Path to a <code>Dockerfile</code> which also triggers <em>Dockerfile mode</em>. See <a href=\"#external-dockerfile\">External Dockerfile</a> for details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>dockerArchive</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Path to a saved image archive which is then imported. See <a href=\"#external-dockerfile\">Docker archive</a> for details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#misc-startup\"><strong>entryPoint</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">An entrypoint allows you to configure a container that will run as an executable. See <a href=\"#misc-startup\">Startup Arguments</a> for details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#misc-env\"><strong>env</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The environments as described in <a href=\"#misc-env\">Setting Environment Variables and Labels</a>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>filter</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Enable and set the delimiters for property replacements. By default properties in the format <code>${..}</code> are replaced with Maven properties. You can switch off property replacement by setting this property to <code>false</code>. When using a single char like <code>@</code> then this is used as a delimiter (e.g <code>@&#8230;&#8203;@</code>). See <a href=\"#build-filtering\">Filtering</a> for more details.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a id=\"build-config-from\"></a><strong>from</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The base image which should be used for this image. If not given this default to <code>busybox:latest</code> and is suitable for a pure data image.\nIn case of an <a href=\"#build-openshift\">S2I Binary build</a> this parameter specifies the S2I Builder Image to use, which by default is <code>fabric8/s2i-java:latest</code>. See also <a href=\"#build-config-from-ext\">from-ext</a> how to add additional properties for the base image.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a id=\"build-config-from-ext\"></a><strong>fromExt</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Extended definition for a base image. This field holds a map of defined in <code>&lt;key&gt;value&lt;/key&gt;</code> format. The known keys are:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>&lt;name&gt;</code> : Name of the base image</p>\n</li>\n<li>\n<p><code>&lt;kind&gt;</code> : Kind of the reference to the builder image when in S2I build mode. By default its <code>ImageStreamTag</code> but can be also <code>ImageStream</code>. An alternative would be <code>DockerImage</code></p>\n</li>\n<li>\n<p><code>&lt;namespace&gt;</code> : Namespace where this builder image lives.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>A provided <code>&lt;from&gt;</code> takes precedence over the name given here. This tag is useful for extensions of this plugin.</p>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#build-healthcheck\"><strong>healthCheck</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Definition of a health check as described in <a href=\"#build-healthcheck\">Healthcheck</a></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>imagePullPolicy</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Specific pull policy for the base image. This overwrites any global pull policy.\n See the global configuration option <a href=\"#image-pull-policy\">imagePullPolicy</a> for the possible values and the default.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#misc-env\"><strong>labels</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Labels as described in <a href=\"#misc-env\">Setting Environment Variables and Labels</a>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>maintainer</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The author (<code>MAINTAINER</code>) field for the generated image</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>noCache</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Don&#8217;t use Docker&#8217;s build cache. This can be overwritten by setting a system property <code>docker.noCache</code> when running Maven.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>cacheFrom</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A list of <code>&lt;image&gt;</code> elements specifying image names to use as cache sources.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>optimise</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">if set to true then it will compress all the <code>runCmds</code> into a single <code>RUN</code> directive so that only one image layer is created.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>ports</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The exposed ports which is a list of <code>&lt;port&gt;</code> elements, one for each port to expose. Whitespace is trimmed from each element and empty elements are ignored. The format can be either pure numerical (\"8080\") or with the protocol attached (\"8080/tcp\").</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>shell</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Shell to be used for the <strong>runCmds</strong>. It contains <strong>arg</strong> elements which are defining the executable and its params.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>runCmds</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Commands to be run during the build process. It contains <strong>run</strong> elements which are passed to the shell. Whitespace is trimmed from each element and empty elements are ignored. The run commands are inserted right after the assembly and after <strong>workdir</strong> into the Dockerfile.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skip</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">if set to true disables building of the image. This config option is best used together with a maven property</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipTag</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code> this plugin won&#8217;t add any tags to images.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tags</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of additional <code>tag</code> elements with which an image is to be tagged after the build. Whitespace is trimmed from each element and empty elements are ignored.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>user</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">User to which the Dockerfile should switch to the end (corresponds to the <code>USER</code> Dockerfile directive).</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>volumes</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of <code>volume</code> elements to create a container volume. Whitespace is trimmed from each element and empty elements are ignored.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>workdir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Directory to change to when starting the container.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>From this configuration this Plugin creates an in-memory Dockerfile,\ncopies over the assembled files and calls the Docker daemon via its\nremote API.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;build&gt;\n &lt;from&gt;java:8u40&lt;/from&gt;\n &lt;maintainer&gt;john.doe@example.com&lt;/maintainer&gt;\n &lt;tags&gt;\n &lt;tag&gt;latest&lt;/tag&gt;\n &lt;tag&gt;${project.version}&lt;/tag&gt;\n &lt;/tags&gt;\n &lt;ports&gt;\n &lt;port&gt;8080&lt;/port&gt;\n &lt;/ports&gt;\n &lt;volumes&gt;\n &lt;volume&gt;/path/to/expose&lt;/volume&gt;\n &lt;/volumes&gt;\n &lt;buildOptions&gt;\n &lt;shmsize&gt;2147483648&lt;/shmsize&gt;\n &lt;/buildOptions&gt;\n\n &lt;shell&gt;\n &lt;exec&gt;\n &lt;arg&gt;/bin/sh&lt;/arg&gt;\n &lt;arg&gt;-c&lt;/arg&gt;\n &lt;/exec&gt;\n &lt;/shell&gt;\n &lt;runCmds&gt;\n &lt;run&gt;groupadd -r appUser&lt;/run&gt;\n &lt;run&gt;useradd -r -g appUser appUser&lt;/run&gt;\n &lt;/runCmds&gt;\n\n &lt;entryPoint&gt;\n &lt;!-- exec form for ENTRYPOINT --&gt;\n &lt;exec&gt;\n &lt;arg&gt;java&lt;/arg&gt;\n &lt;arg&gt;-jar&lt;/arg&gt;\n &lt;arg&gt;/opt/demo/server.jar&lt;/arg&gt;\n &lt;/exec&gt;\n &lt;/entryPoint&gt;\n\n &lt;assembly&gt;\n &lt;mode&gt;dir&lt;/mode&gt;\n &lt;targetDir&gt;/opt/demo&lt;/targetDir&gt;\n &lt;descriptor&gt;assembly.xml&lt;/descriptor&gt;\n &lt;/assembly&gt;\n&lt;/build&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>In order to see the individual build steps you can switch on <code>verbose</code> mode either by setting the property\n<code>jkube.docker.verbose</code> or by using <code>&lt;verbose&gt;true&lt;/verbose&gt;</code> in the <a href=\"#build-goal-configuration\">Build Goal configuration</a></p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-assembly\">5.2.7. Assembly</h4>\n<div class=\"paragraph\">\n<p>The <code>&lt;assembly&gt;</code> element within <code>&lt;build&gt;</code> element has an XML structure and defines how build artifacts and other files\ncan be added to the Docker image.</p>\n</div>\n<table id=\"config-image-build-assembly\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 15. Assembly Configuration (<a href=\"#config-image\">&lt;image&gt; </a> : <a href=\"#config-image-build\">&lt;build&gt; </a>)</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Assembly name, which is <code>maven</code> by default. This name is used for the archives and directories created during the build.\n This directory holds the files specified by the assembly. If an <a href=\"#external-dockerfile\">external Dockerfile</a> is used then\n this name is also the relative directory which contains the assembly files.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>targetDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Directory under which the files and artifacts contained in the assembly will be copied within the container.\n The default value for this is <code>/&lt;assembly name&gt;</code>, so <code>/maven</code> if <strong>name</strong> is not set to a different value.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#build-assembly-inline\"><strong>inline</strong></a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Inlined assembly descriptor as described in <a href=\"#build-assembly-inline\">Assembly - Inline</a> below.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>exportTargetDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Specification whether the <code>targetDir</code> should be exported as a volume. This value is <code>true</code> by default except in the\n case the <code>targetDir</code> is set to the container root (<code>/</code>). It is also <code>false</code> by default when a base image is used with\n <code>from</code> since exporting makes no sense in this case and will waste disk space unnecessarily.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>excludeFinalOutputArtifact</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">By default, the project&#8217;s final artifact will be included in the assembly, set this flag to true in case the\n artifact should be excluded from the assembly.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>mode</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Mode how the how the assembled files should be collected:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>dir</code> : Files are simply copied (default),</p>\n</li>\n<li>\n<p><code>tar</code> : Transfer via tar archive</p>\n</li>\n<li>\n<p><code>tgz</code> : Transfer via compressed tar archive</p>\n</li>\n<li>\n<p><code>zip</code> : Transfer via ZIP archive</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>The archive formats have the advantage that file permission can be preserved better (since the copying is independent\nfrom the underlying files systems), but might triggers internal bugs from the Maven assembler (as it has been reported\nin <a href=\"https://github.com/fabric8io/docker-maven-plugin/issues/171\">#171</a>)</p>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>permissions</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>Permission of the files to add:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>ignore</code> to use the permission as found on files regardless on any\nassembly configuration</p>\n</li>\n<li>\n<p><code>keep</code> to respect the assembly provided permissions</p>\n</li>\n<li>\n<p><code>exec</code> for setting the executable bit on all files (required for Windows when using an assembly mode <code>dir</code>)</p>\n</li>\n<li>\n<p><code>auto</code> to let the plugin select <code>exec</code> on Windows and <code>keep</code> on others.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p><code>keep</code> is the default value.</p>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tarLongFileMode</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Sets the TarArchiver behaviour on file paths with more than 100 characters length. Valid values are: \"warn\"(default), \"fail\", \"truncate\", \"gnu\", \"posix\", \"posix_warn\" or \"omit\"</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>user</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>User and/or group under which the files should be added. The user must already exist in the base image.</p>\n</div>\n<div class=\"paragraph\">\n<p>It has the general format <code>user[:group[:run-user]]</code>. The user and group can be given either as numeric user- and group-id or as names. The group id is optional.</p>\n</div>\n<div class=\"paragraph\">\n<p>If a third part is given, then the build changes to user <code>root</code> before changing the ownerships, changes the ownerships and then change to user <code>run-user</code> which is then used for the final command to execute. This feature might be needed, if the base image already changed the user (e.g. to 'jboss') so that a <code>chown</code> from root to this user would fail.</p>\n</div>\n<div class=\"paragraph\">\n<p>For example, the image <code>jboss/wildfly</code> use a \"jboss\" user under which all commands are executed. Adding files in Docker always happens under the UID root. These files can only be changed to \"jboss\" is the <code>chown</code> command is executed as root. For the following commands to be run again as \"jboss\" (like the final <code>standalone.sh</code>), the plugin switches back to user <code>jboss</code> (this is this \"run-user\") after changing the file ownership. For this example a specification of\n<code>jboss:jboss:jboss</code> would be required.</p>\n</div></div></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>In the event you do not need to include any artifacts with the image, you may safely omit this element from the configuration.</p>\n</div>\n<div class=\"sect4\">\n<h5 id=\"build-assembly-inline\">Assembly - Inline</h5>\n<div class=\"paragraph\">\n<p>Inlined assembly description with a format very similar to\n<a href=\"https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html\">Maven Assembly Plugin</a>.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 16. Assembly - Inline (<a href=\"#config-image\">&lt;image&gt; </a> : <a href=\"#config-image-build\">&lt;build&gt; </a> : <a href=\"#config-image-build-assembly\">&lt;assembly&gt; </a>)</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>id</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Unique ID for the assembly.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>files</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>List of files for the assembly.</p>\n</div>\n<div class=\"paragraph\">\n<p>Each file has the following fields:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>source</code>: Absolute or relative path from the project&#8217;s directory of the file to be included in the assembly.</p>\n</li>\n<li>\n<p><code>outputDirectory</code>: Output directory relative to the root of the root directory of the assembly.</p>\n</li>\n<li>\n<p><code>destName</code>: Destination filename in the outputDirectory.</p>\n</li>\n<li>\n<p><code>fileMode</code>: Similar to a UNIX permission, sets the file mode of the file included.</p>\n</li>\n</ul>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>fileSets</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>List of filesets for the Assembly.</p>\n</div>\n<div class=\"paragraph\">\n<p>Each fileset has the following fields:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>directory</code>: Absolute or relative location from the project&#8217;s directory.</p>\n</li>\n<li>\n<p><code>outputDirectory</code>: Output directory relative to the root of the root directory of the assembly fileSet.</p>\n</li>\n<li>\n<p><code>includes</code>: A set of files and directories to include.</p>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>If none is present, then everything is included.</p>\n</li>\n<li>\n<p>Files can be referenced by using their complete path name.</p>\n</li>\n<li>\n<p>Wildcards are also supported, patterns will be matched using\n<a href=\"https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/FileSystem.html#getPathMatcher(java.lang.String)\">\nFileSystem#getPathMatcher</a> <code>glob</code> syntax.</p>\n</li>\n</ul>\n</div>\n</li>\n<li>\n<p><code>excludes</code>: A set of files and directory to exclude.</p>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>If none is present, then there are no exclusions.</p>\n</li>\n</ul>\n</div>\n</li>\n<li>\n<p><code>fileMode</code>: Similar to a UNIX permission, sets the file mode of the files included.</p>\n</li>\n<li>\n<p><code>directoryMode</code>: Similar to a UNIX permission, sets the directory mode of the directories included.</p>\n</li>\n</ul>\n</div></div></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>baseDirectory</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Base directory from which to resolve the Assembly files and filesets.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"misc-env\">5.2.8. Environment and Labels</h4>\n<div class=\"paragraph\">\n<p>When creating a container one or more environment variables can be set via configuration with the <code>env</code> parameter</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;env&gt;\n &lt;JAVA_HOME&gt;/opt/jdk8&lt;/JAVA_HOME&gt;\n &lt;CATALINA_OPTS&gt;-Djava.security.egd=file:/dev/./urandom&lt;/CATALINA_OPTS&gt;\n&lt;/env&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If you put this configuration into profiles you can easily create various test variants with a single image (e.g. by switching the JDK or whatever).</p>\n</div>\n<div class=\"paragraph\">\n<p>It is also possible to set the environment variables from the outside of the plugin&#8217;s configuration with the parameter <code>envPropertyFile</code>. If given, this property file is used to set the environment variables where the keys and values specify the environment variable. Environment variables specified in this file override any environment variables specified in the configuration.</p>\n</div>\n<div class=\"paragraph\">\n<p>Labels can be set inline the same way as environment variables:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;labels&gt;\n &lt;com.example.label-with-value&gt;foo&lt;/com.example.label-with-value&gt;\n &lt;version&gt;${project.version}&lt;/version&gt;\n &lt;artifactId&gt;${project.artifactId}&lt;/artifactId&gt;\n&lt;/labels&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"misc-startup\">5.2.9. Startup Arguments</h4>\n<div class=\"paragraph\">\n<p>Using <code>entryPoint</code> and <code>cmd</code> it is possible to specify the <a href=\"https://docs.docker.com/reference/builder/#entrypoint\">entry point</a>\nor <a href=\"https://docs.docker.com/reference/builder/#cmd\">cmd</a> for a container.</p>\n</div>\n<div class=\"paragraph\">\n<p>The difference is, that an <code>entrypoint</code> is the command that always be executed, with the <code>cmd</code> as argument. If no <code>entryPoint</code> is provided, it defaults to <code>/bin/sh -c</code> so any <code>cmd</code> given is executed with a shell. The arguments given to <code>docker run</code> are always given as arguments to the\n<code>entrypoint</code>, overriding any given <code>cmd</code> option. On the other hand if no extra arguments are given to <code>docker run</code> the default <code>cmd</code> is used as argument to <code>entrypoint</code>.</p>\n</div>\n<div class=\"sidebarblock\">\n<div class=\"content\">\n<div class=\"paragraph\">\n<p>See this <a href=\"http://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile\">stackoverflow question</a> for a detailed explanation.</p>\n</div>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>An entry point or command can be specified in two alternative formats:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 17. Entrypoint and Command Configuration</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Mode</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>shell</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Shell form in which the whole line is given to <code>shell -c</code> for interpretation.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>exec</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of arguments (with inner <code>&lt;args&gt;</code>) arguments which will be given to the <code>exec</code> call directly without any shell interpretation.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Either shell or params should be specified.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;entryPoint&gt;\n &lt;!-- shell form --&gt;\n &lt;shell&gt;java -jar $HOME/server.jar&lt;/shell&gt;\n&lt;/entryPoint&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>or</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;entryPoint&gt;\n &lt;!-- exec form --&gt;\n &lt;exec&gt;\n &lt;arg&gt;java&lt;/arg&gt;\n &lt;arg&gt;-jar&lt;/arg&gt;\n &lt;arg&gt;/opt/demo/server.jar&lt;/arg&gt;\n &lt;/exec&gt;\n&lt;/entryPoint&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This can be formulated also more dense with:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;!-- shell form --&gt;\n&lt;entryPoint&gt;java -jar $HOME/server.jar&lt;/entryPoint&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>or</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;entryPoint&gt;\n &lt;!-- exec form --&gt;\n &lt;arg&gt;java&lt;/arg&gt;\n &lt;arg&gt;-jar&lt;/arg&gt;\n &lt;arg&gt;/opt/demo/server.jar&lt;/arg&gt;\n&lt;/entryPoint&gt;</code></pre>\n</div>\n</div>\n<div class=\"dlist\">\n<dl>\n<dt class=\"hdlist1\">INFO</dt>\n<dd>\n<p>Startup arguments are not used in S2I builds</p>\n</dd>\n</dl>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-buildargs\">5.2.10. Build Args</h4>\n<div id=\"property-buildargs\" class=\"paragraph\">\n<p>As described in section <a href=\"#build-configuration\">Configuration</a> for external Dockerfiles <a href=\"https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables-build-arg\">Docker build arg</a> can be used. In addition to the\nconfiguration within the plugin configuration you can also use properties to specify them:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Set a system property when running Maven, eg.: <code>-Ddocker.buildArg.http_proxy=http://proxy:8001</code>. This is especially\nuseful when using predefined Docker arguments for setting proxies transparently.</p>\n</li>\n<li>\n<p>Set a project property within the <code>pom.xml</code>, eg.:</p>\n</li>\n</ul>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;docker.buildArg.myBuildArg&gt;myValue&lt;/docker.buildArg.myBuildArg&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Please note that the system property setting will always override the project property. Also note that for all\nproperties which are not Docker <a href=\"https://docs.docker.com/engine/reference/builder/#arg\">predefined</a> properties, the\nexternal Dockerfile must contain an <code>ARGS</code> instruction.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"build-healthcheck\">5.2.11. Healthcheck</h4>\n<div class=\"paragraph\">\n<p>Healthchecks has been introduced since Docker 1.12 and are a way to tell Docker how to test a container to check that it&#8217;s still working. With a health check you specify a command which is periodically executed and checked for its return value. If the healtcheck return with an exit 0 the container is considered to be healthy, if it returns with 1 then the container is not working correctly.</p>\n</div>\n<div class=\"paragraph\">\n<p>The healtcheck configuration can have the following options</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 18. Healthcheck Configuration</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 83.3334%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>cmd</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Command to execute, which can be given in an shell or exec format as described in <a href=\"#misc-startup\">Startup Arguments</a>.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>interval</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Interval for how often to run the healthcheck. The time is specified in seconds, but a time unit can be appended to change this.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>mode</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mode of the healthcheck. This can be <code>cmd</code> which is the default and specifies that the health check should be executed. Or <code>none</code> to disable a health check from the base image. Only use this option with <code>none</code> for disabling some healthcheck from the base image.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>retries</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">How many retries should be performed before the container is to be considered unhealthy.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>startPeriod</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Initialization time for containers that need time to bootstrap. Probe failure during that period will not be counted towards the maximum number of retries. However, if a health check succeeds during the start period, the container is considered started and all consecutive failures will be counted towards the maximum number of retries. Given in seconds, but another time unit can be appended.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>timeout</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Timeout after which healthckeck should be stopped and considered to have failed. Given in seconds, but another time unit can be appended.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>The following example queries an URL every 10s as an healthcheck:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;healthCheck&gt;\n &lt;!-- Check every 5 minutes --&gt;\n &lt;interval&gt;5m&lt;/interval&gt;\n &lt;!-- Fail if no response after 3 seconds --&gt;\n &lt;timeout&gt;3s&lt;/timeout&gt;\n &lt;!-- Allow 30 minutes for the container to start before being flagged as unhealthy --&gt;\n &lt;startPeriod&gt;30m&lt;/startPeriod&gt;\n &lt;!-- Fail 3 times until the container is considerd unhealthy --&gt;\n &lt;retries&gt;3&lt;/retries&gt;\n &lt;!-- Command to execute in shell form --&gt;\n &lt;cmd&gt;curl -f http://localhost/ || exit 1&lt;/cmd&gt;\n&lt;/healthCheck&gt;</code></pre>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:push\">5.3. <strong>oc:push</strong></h3>\n<div class=\"admonitionblock warning\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-warning\" title=\"Warning\"></i>\n</td>\n<td class=\"content\">\nSection needs review and rearrangements\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>This goal uploads images to the registry which have a <code>&lt;build&gt;</code> configuration section. The images to push can be restricted with\nthe global option <code>filter</code> (see <a href=\"#build-goal-configuration\">Build Goal Configuration</a> for details). The registry to push is by\ndefault <code>docker.io</code> but can be specified as part of the images&#8217;s <code>name</code> the Docker way.\nE.g. <code>docker.test.org:5000/data:1.5</code> will push the image <code>data</code> with tag <code>1.5</code> to the registry <code>docker.test.org</code> at port\n<code>5000</code>. Registry credentials (i.e. username and password) can be specified in multiple ways as described in section <a href=\"#authentication\">Authentication</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>By default a progress meter is printed out on the console, which is omitted when using Maven in batch mode (option <code>-B</code>).\nA very simplified progress meter is provided when using no color output (i.e. with <code>-Djkube.useColor=false</code>).</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 19. Push options</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 71.4285%;\">\n<col style=\"width: 14.2858%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipPush</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code> the plugin won&#8217;t push any images that have been built.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.push</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipTag</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code> this plugin won&#8217;t push any tags</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.tag</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pushRegistry</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The registry to use when pushing the image. See <a href=\"#registry\">Registry Handling</a> for\nmore details.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.push.registry</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>retries</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">How often should a push be retried before giving up. This useful for flaky registries which tend to return 500 error codes from time to time. The default is 0 which means no retry at all.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.docker.push.retries</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:apply\">5.4. <strong>oc:apply</strong></h3>\n<div class=\"paragraph\">\n<p>This goal applies the resources created with <a href=\"#jkube:resource\"><strong>oc:resource</strong></a> to a connected Kubernetes cluster. It&#8217;s similar to <a href=\"#jkube:deploy\"><strong>oc:deploy</strong></a> but does not the full deployment cycle of creating the resource, creating the application image and sending the resource descriptors to the clusters. This goal can be easily bound to <code>&lt;executions&gt;</code> within the plugin&#8217;s configuration and binds by default to the <code>install</code> lifecycle phase.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:apply</code></pre>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"Supported-Properties-Apply\">5.4.1. Supported Properties For Apply goal</h4>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 20. Other options available with apply goal</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>recreate</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we update resources by deleting them first and then creating them again.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.recreate</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>openshiftManifest</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The generated kubernetes YAML file.</p>\n<p class=\"tableblock\"> Defaults to <code>${basedir}/target/classes/META-INF/jkube/openshift.yml</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.openshiftManifest</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>create</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we create new resources.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.create</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>rolling</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we use rolling updates to apply changes.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.rolling</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>failOnNoKubernetesJson</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we fail if there is no Kubernetes JSON.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.failOnNoKubernetesJson</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>servicesOnly</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">In services only mode we only process services so that those can be recursively created/updated first before\n creating/updating any pods and replication controllers.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.servicesOnly</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>ignoreServices</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Do we want to ignore services. This is particularly useful when in recreate mode to let you easily recreate all the\n ReplicationControllers and Pods but leave any service definitions alone to avoid changing the portalIP addresses and\n breaking existing pods using the service.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.ignoreServices</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>processTemplatesLocally</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Process templates locally in Java so that we can apply OpenShift templates on any Kubernetes environment.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.processTemplatesLocally</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>deletePods</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Should we delete all the pods if we update a Replication Controller.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.deletePods</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>ignoreRunningOAuthClients</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Do we want to ignore OAuthClients which are already running?. OAuthClients are shared across namespaces so we should\n not try to update or create/delete global oauth clients.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.ignoreRunningOAuthClients</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>jsonLogDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The folder we should store any temporary json files or results.</p>\n<p class=\"tableblock\"> Defaults to <code>${basedir}/target/jkube/applyJson</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.deploy.jsonLogDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>waitSeconds</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">How many seconds to wait for a URL to be generated for a service.</p>\n<p class=\"tableblock\"> Defaults to <code>5</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.serviceUrl.waitSeconds</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>resourceDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Folder where to find project specific files.</p>\n<p class=\"tableblock\"> Defaults to <code>${basedir}/src/main/jkube</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.resourceDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>environment</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Environment name where resources are placed. For example, if you set this property to dev and resourceDir is the\n default one, jkube will look at <code>src/main/jkube/dev</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>null</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.environment</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>skipApply</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Skip applying the resources.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.skip.apply</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:helm\">5.5. <strong>oc:helm</strong></h3>\n<div class=\"paragraph\">\n<p>This goal is for creating\n<a href=\"https://helm.sh/docs/topics/charts\">Helm charts</a>\nfor your Maven project so that you can install, update or delete your app in Kubernetes\nusing <a href=\"https://github.com/helm/helm\">Helm</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>For creating a Helm chart you simply call <code>oc:helm</code> goal on the command line:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:resource oc:helm</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The <code>oc:resource</code> goal is required to create the resource descriptors which are included in the Helm chart.\nIf you have already built the resource then you can omit this goal.</p>\n</div>\n<div class=\"paragraph\">\n<p>The configuration is defined in a <code>&lt;helm&gt;</code> section within the plugin&#8217;s configuration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example Helm configuration</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;configuration&gt;\n &lt;helm&gt;\n &lt;chart&gt;Jenkins&lt;/chart&gt;\n &lt;keywords&gt;ci,cd,server&lt;/keywords&gt;\n &lt;/helm&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This configuration section knows the following sub-elements in order to configure your Helm chart.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 21. Helm configuration</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 71.4285%;\">\n<col style=\"width: 14.2858%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>chart</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart name, which is <code>${project.artifactId}</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.chart</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>version</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart SemVer version, which is <code>${project.version}</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.version</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>description</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart single-sentence description, which is <code>${project.description}</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.description</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>home</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart URL for this project&#8217;s home page, which is <code>${project.url}</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.home</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>sources</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart list of URLs to source code for this project, defaults to the list of <code>${project.scm.url}</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>maintainers</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart list of maintainers (name+email), defaults to the list of\n `${project.developers.name}:${project.developers.name}`if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>icon</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Chart URL to an SVG or PNG image to be used as an icon, default is extracted from the kubernetes manifest\n (<code>kubernetes.yml</code>) <code>jkube.io/iconUrl</code> annotation if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.icon</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keywords</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Comma separated list of keywords to add to the chart.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>engine</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The template engine to use.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>additionalFiles</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The list of additional files to be included in the Chart archive. Any file named <code>README</code> or <code>LICENSE</code> will <strong>always</strong>\n be included by default.</p></td>\n<td class=\"tableblock halign-left valign-top\"></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>type</strong> / <strong>types</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Platform for which to generate the chart. By default this is <code>kubernetes</code>, but can be also <code>openshift</code> for using\n OpenShift specific resources in the chart. You can also add both values as a comma separated list.</p>\n<p class=\"tableblock\"> <em>Please note that there is no OpenShift support yet for charts, so this is experimental.</em></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.type</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>sourceDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where to find the resource descriptors generated with <code>oc:resource</code>.\n By default this is <code>${basedir}/target/classes/META-INF/jkube., which is also the output directory used by `oc:resource</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.sourceDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>outputDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where to create the Helm chart, which is <code>${basedir}/target/jkube/helm</code> by default for Kubernetes\n and <code>${basedir}/target/jkube/helmshift</code> for OpenShift.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.outputDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tarballOutputDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where to create the the Helm chart archive, which is <code>${basedir}/target</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.tarballOutputDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>chartExtension</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Helm chart file extension (<code>tgz</code>, <code>tar.bz</code>, <code>tar.bzip2</code>, <code>tar.bz2</code>), default value is <code>tar.gz</code> if not provided.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.helm.chartExtension</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>In a next step you can install this via the <a href=\"https://github.com/helm/helm/releases\">helm command line tool</a> as follows:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">helm install nameForChartInRepository target/jkube/helm/${chartName}/kubernetes</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>or</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>helm install target/jkube/helm/${chartName}/kubernetes --generate-name</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>To add the <code>helm</code> goal to your project so that it is automatically executed just add the <code>helm</code> goal to the <code>executions</code>\nsection of the <code>openshift-maven-plugin</code> section of your <code>pom.xml</code>.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Add helm goal</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n\n &lt;!-- ... --&gt;\n\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;goal&gt;deploy&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>In addition this goal will also create a tar-archive below <code>${basedir}/target</code> which contains the chart with its template.\nThis tar is added as an artifact with classifier <code>helm</code> to the build (<code>helmshift</code> for the OpenShift mode).</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"goals-overview-develop\">6. Development Goals</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"jkube:deploy\">6.1. <strong>oc:deploy</strong></h3>\n<div class=\"paragraph\">\n<p>This is the main goal for building your docker image, generating the kubernetes resources and deploying them into the cluster (insofar your pom.xml is set up correct; keep reading :)).</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:deploy</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This goal is designed to run <a href=\"#jkube:build\"><strong>oc:build</strong></a> and <a href=\"#jkube:resource\"><strong>oc:resource</strong></a> before the deploy <strong>if</strong> you have the goals bound in your pom.xml:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n\n &lt;!-- Connect oc:resource, oc:build and oc:helm to lifecycle phases --&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Effectively this builds your project then invokes these goals:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"#jkube:build\"><strong>oc:build</strong></a></p>\n</li>\n<li>\n<p><a href=\"#jkube:apply\"><strong>oc:apply</strong></a></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>By default the behaviour of resource goal is it generates <code>route.yml</code> for a service if you have not done any configuration changes. Sometimes there may be case when you want to generate route.yml but do not want to create route resource on OpenShift Cluster. This can be achieved by the following configuration.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example for not generating route resource on your cluster</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;excludes&gt;\n &lt;exclude&gt;jkube-expose&lt;/exclude&gt;\n &lt;/excludes&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:undeploy\">6.2. <strong>oc:undeploy</strong></h3>\n<div class=\"paragraph\">\n<p>This goal is for deleting the kubernetes resources that you deployed via the <a href=\"#jkube:apply\"><strong>oc:apply</strong></a> or <a href=\"#jkube:deploy\"><strong>oc:deploy</strong></a> goals</p>\n</div>\n<div class=\"paragraph\">\n<p>It iterates through all the resources generated by the <a href=\"#jkube:resource\"><strong>oc:resource</strong></a> goal and deletes them from your current kubernetes cluster.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:undeploy</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:log\">6.3. <strong>oc:log</strong></h3>\n<div class=\"paragraph\">\n<p>This goal tails the log of the app that you deployed via the <a href=\"#jkube:deploy\"><strong>oc:deploy</strong></a> goal</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:log</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>You can then terminate the output by hitting <code>Ctrl+C</code></p>\n</div>\n<div class=\"paragraph\">\n<p>If you wish to get the log of the app and then terminate immediately then try:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:log -Djkube.log.follow=false</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This lets you pipe the output into grep or some other tool</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:log -Djkube.log.follow=false | grep Exception</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If your app is running in multiple pods you can configure the pod name to log via the <code>jkube.log.pod</code> property, otherwise it defaults to the latest pod:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:log -Djkube.log.pod=foo</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If your pod has multiple containers you can configure the container name to log via the <code>jkube.log.container</code> property, otherwise it defaults to the first container:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:log -Djkube.log.container=foo</code></pre>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"Supported-Properties-Log\">6.3.1. Supported Properties for Log goal</h4>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 22. Options available with log goal</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>logFollow</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Get follow logs for your application inside Kubernetes.</p>\n<p class=\"tableblock\"> Defaults to <code>true</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.log.follow</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>logContainer</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Get logs of some specific container inside your application Deployment.</p>\n<p class=\"tableblock\"> Defaults to <code>null</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.log.container</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>logPod</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Get logs of some specific pod inside your application Deployment.</p>\n<p class=\"tableblock\"> Defaults to <code>null</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.log.pod</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:debug\">6.4. <strong>oc:debug</strong></h3>\n<div class=\"paragraph\">\n<p>This goal enables debugging in your Java app and then port forwards from localhost to the latest running pod of your app so that you can easily debug your app from your Java IDE.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:debug</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then follow the on screen instructions.</p>\n</div>\n<div class=\"paragraph\">\n<p>The default debug port is <code>5005</code>. If you wish to change the local port to use for debugging then pass in the <code>jkube.debug.port</code> parameter:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:debug -Djkube.debug.port=8000</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then in your IDE you start a Remote debug execution using this remote port using localhost and you should be able to set breakpoints and step through your code.</p>\n</div>\n<div class=\"paragraph\">\n<p>This lets you debug your apps while they are running inside a Kubernetes cluster - for example if you wish to debug a REST endpoint while another pod is invoking it.</p>\n</div>\n<div class=\"paragraph\">\n<p>Debug is enabled via the <code>JAVA_ENABLE_DEBUG</code> environment variable being set to <code>true</code>. This environment variable is used for all the standard Java docker images used by Spring Boot, flat classpath and executable JAR projects and Wildfly Swarm. If you use your own custom docker base image you may wish to also respect this environment variable too to enable debugging.</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_speeding_up_debugging\">6.4.1. Speeding up debugging</h4>\n<div class=\"paragraph\">\n<p>By default the <code>oc:debug</code> goal has to edit your Deployment to enable debugging then wait for a pod to start. It might be in development you frequently want to debug things and want to speed things up a bit.</p>\n</div>\n<div class=\"paragraph\">\n<p>If so you can enable debug mode for each build via the <code>jkube.debug.enabled</code> property.</p>\n</div>\n<div class=\"paragraph\">\n<p>e.g. you can pass this property on the command line:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:deploy -Djkube.debug.enabled=true</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Or you can add something like this to your <code>~/.m2/settings.xml</code> file so that you enable debug mode for all maven builds on your laptop by using a profile :</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;?xml version=\"1.0\"?&gt;\n&lt;settings&gt;\n &lt;profiles&gt;\n &lt;profile&gt;\n &lt;id&gt;enable-debug&lt;/id&gt;\n &lt;activation&gt;\n &lt;activeByDefault&gt;true&lt;/activeByDefault&gt;\n &lt;/activation&gt;\n &lt;properties&gt;\n &lt;jkube.debug.enabled&gt;true&lt;/jkube.debug.enabled&gt;\n &lt;/properties&gt;\n &lt;/profile&gt;\n &lt;/profiles&gt;\n&lt;/settings&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then whenever you type the <code>oc:debug</code> goal there is no need for the maven goal to edit the <code>Deployment</code> and wait for a pod to restart; we can immediately start debugging when you type:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:debug</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_debugging_with_suspension\">6.4.2. Debugging with suspension</h4>\n<div class=\"paragraph\">\n<p>The <code>oc:debug</code> goal allows to attach a remote debugger to a running container, but the application is free to execute when the debugger is not attached.\nIn some cases, you may want to have complete control on the execution, e.g. to investigate the application behavior at startup. This can be done using the <code>jkube.debug.suspend</code> flag:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:debug -Djkube.debug.suspend</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The suspend flag will set the <code>JAVA_DEBUG_SUSPEND</code> environment variable to <code>true</code> and <code>JAVA_DEBUG_SESSION</code> to a random number in your deployment.\nWhen the <code>JAVA_DEBUG_SUSPEND</code> environment variable is set, standard docker images will use <code>suspend=y</code> in the JVM startup options for debugging.</p>\n</div>\n<div class=\"paragraph\">\n<p>The <code>JAVA_DEBUG_SESSION</code> environment variable is always set to a random number (each time you run the debug goal with the suspend flag) in order to tell Kubernetes to restart the pod.\nThe remote application will start only after a remote debugger is attached. You can use the remote debugging feature of your IDE to connect (on <code>localhost</code>, port <code>5005</code> by default).</p>\n</div>\n<div class=\"admonitionblock warning\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-warning\" title=\"Warning\"></i>\n</td>\n<td class=\"content\">\nThe <code>jkube.debug.suspend</code> flag will disable readiness probes in the Kubernetes deployment in order to start port-forwarding during the early phases of application startup\n</td>\n</tr>\n</table>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"Supported-Properties-Debug\">6.4.3. Supported Properties For Debug Goal</h4>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 23. Options available with debug goal</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>debugPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Default port available for debugging your application inside Kubernetes.</p>\n<p class=\"tableblock\"> Defaults to <code>5005</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.debug.port</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>debugSuspend</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Disables readiness probes in Kubernetes Deployment in order to start port forwarding during early phases of\n application startup.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.debug.suspend</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"jkube:watch\">6.5. <strong>oc:watch</strong></h3>\n<div class=\"paragraph\">\n<p>This goal is used to monitor the project workspace for changes and automatically trigger a redeploy of the application\nrunning on Kubernetes.</p>\n</div>\n<div class=\"paragraph\">\n<p>In order to use oc:watch for spring-boot, you need to make sure that <code>devtools</code> is included in the repacked\narchive, as shown in the following listing:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;\n &lt;configuration&gt;\n &lt;excludeDevtools&gt;false&lt;/excludeDevtools&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then you need to set a <code>spring.devtools.remote.secret</code> in application.properties, as shown in the following example:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>spring.devtools.remote.secret=mysecret</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Before entering the watch mode, this goal must generate the docker image and the Kubernetes resources\n(optionally including some development libraries/configuration),\nand deploy the app on Kubernetes. Lifecycle bindings should be configured as follows to allow\nthe generation of such resources.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Lifecycle bindings for oc:watch</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n\n &lt;!-- ... --&gt;\n\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>For any application having <code>resource</code> and <code>build</code> goals bound to the lifecycle, the following\ncommand can be used to run the watch task.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mvn oc:watch</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This plugin supports different watcher providers, enabled automatically if the project satisfies certain conditions.</p>\n</div>\n<div class=\"paragraph\">\n<p>Watcher providers can also be configured manually. The <a href=\"#generator-example\">Generator example</a> is a good blueprint, simply replace <code>&lt;generator&gt;</code> with <code>&lt;watcher&gt;</code>. The configuration is structurally identical.</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"watcher-spring-boot\">6.5.1. Spring Boot</h4>\n<div class=\"paragraph\">\n<p>This watcher is enabled by default for all Spring Boot projects. It performs the following actions:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>deploys your application with Spring Boot DevTools enabled</p>\n</li>\n<li>\n<p>tails the log of the latest running pod for your application</p>\n</li>\n<li>\n<p>watches the local development build of your Spring Boot based application and then triggers a reload of the application when there are changes</p>\n</li>\n</ul>\n</div>\n<div class=\"admonitionblock warning\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-warning\" title=\"Warning\"></i>\n</td>\n<td class=\"content\">\nSpring devtools automatically ignores projects named <code>spring-boot</code>, <code>spring-boot-devtools</code>,\n <code>spring-boot-autoconfigure</code>, <code>spring-boot-actuator</code>, <code>and spring-boot-starter</code>\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>You can try it on any spring boot application via:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn oc:watch</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Once the goal starts up the spring boot RemoteSpringApplication it will watch for local development changes.</p>\n</div>\n<div class=\"paragraph\">\n<p>e.g. if you edit the java code of your app and then build it via something like this:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn package</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>You should see your app reload on the fly in the shell running the <a href=\"#jkube:watch\"><strong>oc:watch</strong></a> goal!</p>\n</div>\n<div class=\"paragraph\">\n<p>There is also support for LiveReload as well.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"watcher-docker-image\">6.5.2. Docker Image</h4>\n<div class=\"paragraph\">\n<p>This is a generic watcher that can be used in Kubernetes mode only. Once activated, it listens for changes in the project workspace\n in order to trigger a redeploy of the application.</p>\n</div>\n<div class=\"paragraph\">\n<p>The watcher can be activated e.g. by running this command in another shell:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn package</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The watcher will detect that the binary artifact has changed and will first rebuild the docker image,\nthen start a redeploy of the Kubernetes pod.</p>\n</div>\n<div class=\"paragraph\">\n<p>It uses the watch feature of the <a href=\"https://dmp.fabric8.io/#docker:watch\">docker-maven-plugin</a> under the hood.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"Supported-Properties-Watch\">6.5.3. Supported Properties for Watch goal</h4>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 24. Options available with watch goal</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>kubernetesManifest</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The generated kubernetes YAML file.</p>\n<p class=\"tableblock\"> Defaults to <code>${basedir}/target/classes/META-INF/jkube/kubernetes.yml</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.kubernetesManifest</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchMode</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><div class=\"content\"><div class=\"paragraph\">\n<p>How to watch for image changes.</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>copy</code>: Copy watched artifacts into container</p>\n</li>\n<li>\n<p><code>build</code>: Build only images</p>\n</li>\n<li>\n<p><code>run</code>: Run images</p>\n</li>\n<li>\n<p><code>both</code>: Build and run images</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Defaults to <code>both</code>.</p>\n</div></div></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.mode</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchInterval</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Interval in milliseconds (how often to check for changes).</p>\n<p class=\"tableblock\"> Defaults to <code>5000</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.interval</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keepRunning</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to true all containers will be kept running after oc:watch has been stopped.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.keepRunning</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchPostGoal</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A maven goal which should be called if a rebuild or a restart has been performed.</p>\n<p class=\"tableblock\"> This goal must have the format <code>&lt;pluginGroupId&gt;:&lt;pluginArtifactId&gt;:&lt;goal&gt;</code> and the plugin must be\n configured in the pom.xml.</p>\n<p class=\"tableblock\"> For example a post-goal <code>com.example:group:delete-pods</code> will trigger the <code>delete-pods</code>\n goal of this hypothetic example.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.postGoal</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchPostExec</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A command which is executed within the container after files are copied into this container\n when watchMode is copy. Note that this container must be running.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.postExec</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keepContainer</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If this is set to <code>false</code> (and <code>keepRunning</code> is disabled) then all containers will be removed after\n they have been stopped.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.keepContainer</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>removeVolumes</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code> remove any volumes associated with the container as well.</p>\n<p class=\"tableblock\"> This option will be ignored if either <code>keepContainer</code> or <code>keepRunning</code> is <code>true</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.removeVolumes</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchShowLogs</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to <code>true</code>, logs will be shown for watched container.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.showLogs</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>watchFollow</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If <code>watchShowLogs</code> is set to <code>false</code>, and there is a run image configuration, logs are followed\n if set to <code>true</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.watch.follow</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"generators\">7. Generators</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The usual way to define Docker images is with the plugin configuration as explained in <a href=\"#jkube:build\"><strong>oc:build</strong></a>. This can either be done completely within the <code>pom.xml</code> or by referring to an external Dockerfile. Since openshift-maven-plugin includes <a href=\"https://github.com/jkubeio/docker-maven-plugin\">docker-maven-plugin</a> the way by which images are built is identical.</p>\n</div>\n<div class=\"paragraph\">\n<p>However, this plugin provides an additional route for defining image configurations. This is done by so called <em>Generators</em>. A generator is a Java component providing an auto-detection mechanism for certain build types like a Spring Boot build or a plain Java build. As soon as a <em>Generator</em> detects that it is applicable it will be called with the list of images configured in the <code>pom.xml</code>. Typically a generator only creates dynamically a new image configuration if this list is empty. But a generator is free to also add new images to an existing list or even change the current image list.</p>\n</div>\n<div class=\"paragraph\">\n<p>You can easily create your own generator as explained in <a href=\"#generators-api\">Generator API</a>. This section will focus on existing generators and how you can configure them.</p>\n</div>\n<div class=\"paragraph\">\n<p>The included <em>Generators</em> are enabled by default, but you can easily disable them or only select a certain set of generators. Each generator has a <em>name</em>, which is unique for a generator.</p>\n</div>\n<div class=\"paragraph\">\n<p>The generator configuration is embedded in a <code>&lt;generator&gt;</code> configuration section:</p>\n</div>\n<div id=\"generator-example\" class=\"listingblock\">\n<div class=\"title\">Example for a generator configuration</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n ....\n &lt;configuration&gt;\n ....\n &lt;generator&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;includes&gt; <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n &lt;include&gt;spring-boot&lt;/include&gt;\n &lt;/includes&gt;\n &lt;config&gt; <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n &lt;spring-boot&gt; <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n &lt;alias&gt;ping&lt;/alias&gt;\n &lt;/spring-boot&gt;\n &lt;/config&gt;\n &lt;/generator&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Start of generators' configuration.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td>Generators can be included and excluded. Includes have precedence, and the generators are called in the given order.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td>Configuration for individual generators.</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td>The config is a map of supported config values. Each section is embedded in a tag named after the generator.</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>The following sub-elements are supported:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 25. Generator configuration</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;includes&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Contains one ore more <code>&lt;include&gt;</code> elements with generator names which should be included. If given only this list of generators are included in this given order. The order is important because by default only the first matching generator kicks in. The generators from every active profile are included, too. However the generators listed here are moved to the front of the list, so that they are called first. Use the profile <code>raw</code> if you want to explicitly set the complete list of generators.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;excludes&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Holds one or more <code>&lt;exclude&gt;</code> elements with generator names to exclude. If set then all detected generators are used except the ones mentioned in this section.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;config&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Configuration for all generators. Each generator support a specific set of configuration values as described in the documentation. The subelements of this section are generator names to configure. E.g. for generator <code>spring-boot</code>, the sub-element is called <code>&lt;spring-boot&gt;</code>. This element then holds the specific generator configuration like <code>&lt;name&gt;</code> for specifying the final image name. See above for an example. Configuration coming from profiles are merged into this config, but not overriding the configuration specified here.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Beside specifying generator configuration in the plugin&#8217;s configuration it can be set directly with properties, too:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example generator property config</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn -Djkube.generator.java-exec.webPort=8082</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The general scheme is a prefix <code>jkube.generator.</code> followed by the unique generator name and then the generator specific key.</p>\n</div>\n<div class=\"paragraph\">\n<p>In addition to the provided default <em>Generators</em> described in the next section <a href=\"#generators-default\">Default Generators</a>, custom generators can be easily added. There are two ways to include generators:</p>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Plugin dependency</div>\n<p>You can declare the generator holding jars as dependency to this plugin as shown in this example</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n ....\n &lt;dependencies&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.acme&lt;/groupId&gt;\n &lt;artifactId&gt;mygenerator&lt;/artifactId&gt;\n &lt;version&gt;1.0&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;/dependencies&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Compile time dependency</div>\n<p>Alternatively and if your application code comes with a custom generator you can set the global configuration option <code>useProjectClasspath</code> (property: <code>jkube.useProjectClasspath</code>) to true. In this case also the project artifact and its dependencies are looked up for <em>Generators</em>. See <a href=\"#generators-api\">Generator API</a> for details how to write your own generators.</p>\n</div>\n<div class=\"sect2\">\n<h3 id=\"generators-default\">7.1. Default Generators</h3>\n<div class=\"paragraph\">\n<p>All default generators examine the build information for certain aspects and generate a Docker build configuration on the fly. They can be configured to a certain degree, where the configuration is generator specific.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 26. Default Generators</caption>\n<colgroup>\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 16.6666%;\">\n<col style=\"width: 66.6668%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Generator</th>\n<th class=\"tableblock halign-left valign-top\">Name</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-java-exec\">Java Applications</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>java-exec</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generic generator for flat classpath and fat-jar Java applications</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-spring-boot\">Spring Boot</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>spring-boot</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Spring Boot specific generator</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-wildfly-swarm\">Wildfly Swarm</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>wildfly-swarm</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Wildfly Swarm apps</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-thorntail-v2\">Thorntail v2</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>thorntail-v2</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Thorntail v2 apps</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-vertx\">Vert.x</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Vert.x applications</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-karaf\">Karaf</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>karaf</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Karaf based apps</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-webapp\">Web applications</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>webapps</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for WAR based applications supporting Tomcat, Jetty and Wildfly base images</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-quarkus\">Quarkus</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>Quarkus</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Quarkus based applications</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-openliberty\">Open Liberty</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>openliberty</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for Open Liberty applications</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#generator-wildfly-jar\">WildFly Bootable JAR</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>wildfly-jar</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Generator for WildFly Bootable JAR applications</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>There are some configuration options which are shared by all generators:</p>\n</div>\n<table id=\"generator-options-common\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 27. Common generator options</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>add</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">When set to <code>true</code>, then the generator <em>adds</em> to an existing image configuration. By default this is disabled, so\n that a generator only kicks in when there are no other image configurations in the build, which are either configured\n directly for a <code>oc:build</code> or already added by a generator which has been run previously.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.add</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>alias</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">An alias name for referencing this image in various other parts of the configuration. This is also used in the log\n output. The default alias name is the name of the generator.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.alias</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>from</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">This is the base image from where to start when creating the images. By default the generators make an opinionated\n decision for the base image which are described in the respective generator section.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.from</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>fromMode</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Whe using OpenShift S2I builds the base image can be either a plain docker image (mode: <code>jib</code>) or a reference to an\n <a href=\"https://docs.openshift.com/container-platform/3.3/architecture/core_concepts/builds_and_image_streams.html\"> ImageStreamTag</a>\n (mode: <code>istag</code>). In the case of an ImageStreamTag, <code>from</code> has to be specified in the form <code>namespace/image-stream:tag</code>.\n The mode takes only effect when running in OpenShift mode.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.fromMode</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Docker image name used when doing Docker builds. For OpenShift S2I builds its the name of the image stream. This\n can be a pattern as descibed in <a href=\"#image-name-placeholders\">Name Placeholders</a>. The default is <code>%g/%a:%l</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.name</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>registry</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A optional Docker registry used when doing Docker builds. It has no effect for OpenShift S2I builds.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.registry</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>When used as properties they can be directly referenced with the property names above.</p>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-java-exec\">7.1.1. Java Applications</h4>\n<div class=\"paragraph\">\n<p>One of the most generic <em>Generators</em> is the <code>java-exec</code> generator.\nIt is responsible for starting up arbitrary Java application.\nIt knows how to deal with fat-jar applications where the application and all dependencies are included within a single jar and the <code>MANIFEST.MF</code> within the jar references a main class.\nBut also flat classpath applications, where the dependencies are separate jar files and a main class is given.</p>\n</div>\n<div class=\"paragraph\">\n<p>If no main class is explicitly configured, the plugin first attempts to locate a fat jar.\nIf the Maven build creates a JAR file with a <code>META-INF/MANIFEST.MF</code> containing a <code>Main-Class</code> entry, then this is considered to be the fat jar to use.\nIf there are more than one of such files then the largest one is used.</p>\n</div>\n<div class=\"paragraph\">\n<p>If a main class is configured (see below) then the image configuration will contain the application jar plus all dependency jars.\nIf no main class is configured as well as no fat jar being detected, then this <em>Generator</em> tries to detect a single main class by searching for <code>public static void main(String args[])</code> among the application classes. If exactly one class is found this is considered to be the main class. If no or more than one is found the <em>Generator</em> finally does nothing.</p>\n</div>\n<div class=\"paragraph\">\n<p>It will use the following base image by default, but as explained <a href=\"#generator-options-common\">above</a> and can be changed with the <code>from</code> configuration.</p>\n</div>\n<table id=\"generator-java-exec-from\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 28. Java Base Images</caption>\n<colgroup>\n<col style=\"width: 7.6923%;\">\n<col style=\"width: 30.7692%;\">\n<col style=\"width: 30.7692%;\">\n<col style=\"width: 30.7693%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\"></th>\n<th class=\"tableblock halign-left valign-top\">Docker Build</th>\n<th class=\"tableblock halign-left valign-top\">S2I Build</th>\n<th class=\"tableblock halign-left valign-top\">ImageStream</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Community</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-java-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-java-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube-java</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>These images always refer to the latest tag.</p>\n</div>\n<div class=\"paragraph\">\n<p>When a <code>fromMode</code> of <code>istag</code> is used to specify an <code>ImageStreamTag</code> and when no <code>from</code> is given, then as default the\n<code>ImageStreamTag</code> <code>jkube-java</code> in the namespace <code>openshift</code> is chosen.\nBy default, <code>fromMode = \"docker\"</code> which use the a plain Docker image reference for the S2I builder image.</p>\n</div>\n<div class=\"paragraph\">\n<p>Beside the common configuration parameters described in the table <a href=\"#generator-options-common\">common generator options</a>\nthe following additional configuration options are recognized:</p>\n</div>\n<table id=\"generator-java-exec-options\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 29. Java Application configuration options</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>targetDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Directory within the generated image where to put the detected artefacts into. Change this only if the base image is\n changed, too.</p>\n<p class=\"tableblock\"> Defaults to <code>/deployments</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.java-exec.targetDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>jolokiaPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port of the Jolokia agent exposed by the base image. Set this to 0 if you don&#8217;t want to expose the Jolokia port.</p>\n<p class=\"tableblock\"> Defaults to <code>8778</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.java-exec.jolokiaPort</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>mainClass</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Main class to call. If not given first a check is performed to detect a fat-jar (see above). Next a class is looked up\n by scanning <code>target/classes</code> for a single class with a main method. If no such class is found or if more than one is\n found, then this generator does nothing.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.java-exec.mainClass</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>prometheusPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port of the Prometheus jmx_exporter exposed by the base image. Set this to 0 if you don&#8217;t want to expose the Prometheus\n port.</p>\n<p class=\"tableblock\"> Defaults to <code>9779</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.java-exec.prometheusPort</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>webPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port to expose as service, which is supposed to be the port of a web application. Set this to 0 if you don&#8217;t want to\n expose a port.</p>\n<p class=\"tableblock\"> Defaults to <code>8080</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.java-exec.webPort</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>The exposed ports are typically later on use by <a href=\"#enrichers\">Enrichers</a> to create default Kubernetes or OpenShift services.</p>\n</div>\n<div class=\"paragraph\">\n<p>You can add additional files to the target image within <code>baseDir</code> by placing files into <code>src/main/jkube-includes</code>.\nThese will be added with mode <code>0644</code>, while everything in <code>src/main/jkube-includes/bin</code> will be added with <code>0755</code>.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-spring-boot\">7.1.2. Spring Boot</h4>\n<div class=\"paragraph\">\n<p>This generator is called <code>spring-boot</code> and gets activated when it finds a <code>spring-boot-maven-plugin</code> in the pom.xml.</p>\n</div>\n<div class=\"paragraph\">\n<p>This generator is based on the <a href=\"#generator-java-exec\">Java Application</a> Generator and inherits all of its configuration values. The generated container port is read from the <code>server.port</code> property <code>application.properties</code>, defaulting to <code>8080</code> if it is not found. It also uses the same default images as the <a href=\"#generator-java-exec-from\">java-exec Generator</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Beside the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\">java-exec options</a> the following additional configuration is recognized:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 30. Spring-Boot configuration options</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>color</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set, force the use of color in the Spring Boot console output.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.spring-boot.color</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>The generator adds Kubernetes liveness and readiness probes pointing to either the management or server port as read from the <code>application.properties</code>.\nIf the <code>management.port</code> (for Spring Boot 1) or <code>management.server.port</code> (for Spring Boot 2) and <code>management.ssl.key-store</code> (for Spring Boot 1) or <code>management.server.ssl.key-store</code> (for Spring Boot 2) properties are set in <code>application.properties</code> otherwise or <code>server.ssl.key-store</code> property is set in <code>application.properties</code> then the probes are automatically set to use <code>https</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>The generator works differently when called together with <code>oc:watch</code>.\nIn that case it enables support for <a href=\"http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html\">Spring Boot Developer Tools</a> which allows for hot reloading of the Spring Boot app.\nIn particular, the following steps are performed:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>If a secret token is not provided within the Spring Boot application configuration <code>application.properties</code> or <code>application.yml</code> with the key <code>spring.devtools.remote.secret</code> then a custom secret token is created and added to <code>application.properties</code></p>\n</li>\n<li>\n<p>Add <code>spring-boot-devtools.jar</code> as <code>BOOT-INF/lib/spring-devtools.jar</code> to the spring-boot fat jar.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Since during <code>oc:watch</code> the application itself within the <code>target/</code> directory is modified for allowing easy reloading you must ensure that you do a <code>mvn clean</code> before building an artifact which should be put into production.\nSince the released version are typically generated with a CI system which does a clean build anyway this should be only a theoretical problem.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-wildfly-swarm\">7.1.3. Wildfly Swarm</h4>\n<div class=\"paragraph\">\n<p>The WildFly Swarm generator detects a WildFly Swarm build and disables the Prometheus Java agent because of this <a href=\"https://issues.jboss.org/browse/THORN-1859\">issue</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Otherwise this generator is identical to the <a href=\"#generator-java-exec\">java-exec generator</a>.\nIt supports the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\"><code>java-exec</code> options</a>.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-thorntail-v2\">7.1.4. Thorntail v2</h4>\n<div class=\"paragraph\">\n<p>The Thorntail v2 generator detects a Thorntail v2 build and disables the Prometheus Java agent because of this <a href=\"https://issues.jboss.org/browse/THORN-1859\">issue</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Otherwise this generator is identical to the <a href=\"#generator-java-exec\">java-exec generator</a>. It supports the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\"><code>java-exec</code> options</a>.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-vertx\">7.1.5. Vert.x</h4>\n<div class=\"paragraph\">\n<p>The Vert.x generator detects an application using Eclipse Vert.x. It generates the metadata to start the application as a fat jar.</p>\n</div>\n<div class=\"paragraph\">\n<p>Currently, this generator is enabled if:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>you are using the Vert.x Maven Plugin (<a href=\"https://github.com/reactiverse/vertx-maven-plugin\" class=\"bare\">https://github.com/reactiverse/vertx-maven-plugin</a>)</p>\n</li>\n<li>\n<p>you are depending on <code>io.vertx:vertx-core</code> and uses the Maven Shader plugin</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Otherwise this generator is identical to the <a href=\"#generator-java-exec\">java-exec generator</a>. It supports the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\"><code>java-exec</code> options</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>The generator automatically:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>enable metrics and JMX publishing of the metrics when <code>io.vertx:vertx-dropwizard-metrics</code> is in the project&#8217;s classpath / dependencies.</p>\n</li>\n<li>\n<p>enable clustering when a Vert.x cluster manager is available in the project&#8217;s classpath / dependencies. this is done by appending <code>-cluster</code> to the command line.</p>\n</li>\n<li>\n<p>Force IPv4 stack when <code>vertx-infinispan</code> is used.</p>\n</li>\n<li>\n<p>Disable the async DNS resolver to fallback to the regular JVM DNS resolver.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>You can pass application parameter by setting the <code>JAVA_ARGS</code> env variable. You can pass system properties either using the same variable or using <code>JAVA_OPTIONS</code>. For instance, create <code>src/main/jkube/deployment.yml</code> with the following content to configure <code>JAVA_ARGS</code>:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n template:\n spec:\n containers:\n - env:\n - name: JAVA_ARGS\n value: \"-Dfoo=bar -cluster -instances=2\"</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-karaf\">7.1.6. Karaf</h4>\n<div class=\"paragraph\">\n<p>This generator named <code>karaf</code> kicks in when the build uses a <code>karaf-maven-plugin</code>. By default the following base images are used:</p>\n</div>\n<table id=\"generator-karaf-from\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 31. Karaf Base Images</caption>\n<colgroup>\n<col style=\"width: 7.6923%;\">\n<col style=\"width: 30.7692%;\">\n<col style=\"width: 30.7692%;\">\n<col style=\"width: 30.7693%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\"></th>\n<th class=\"tableblock halign-left valign-top\">Docker Build</th>\n<th class=\"tableblock halign-left valign-top\">S2I Build</th>\n<th class=\"tableblock halign-left valign-top\">ImageStream</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Community</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-karaf-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-karaf-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube-karaf</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>When a <code>fromMode</code> of <code>istag</code> is used to specify an <code>ImageStreamTag</code> and when no <code>from</code> is given, then as default the\n<code>ImageStreamTag</code> <code>jkube-karaf</code> in the namespace <code>openshift</code> is chosen.</p>\n</div>\n<div class=\"paragraph\">\n<p>In addition to the <a href=\"#generator-options-common\">common generator options</a> this generator can be configured with the following options:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 32. Karaf configuration options</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>baseDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Directory within the generated image where to put the detected artifacts into. Change this only if the base image is\n changed, too.</p>\n<p class=\"tableblock\"> Defaults to <code>/deployments</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.karaf.baseDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>webPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port to expose as service, which is supposed to be the port of a web application. Set this to 0 if you don&#8217;t want to\nexpose a port.</p>\n<p class=\"tableblock\"> Defaults to <code>8080</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.karaf.webPort</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-webapp\">7.1.7. Web Applications</h4>\n<div class=\"paragraph\">\n<p>The <code>webapp</code> generator tries to detect WAR builds and selects a base servlet container image based on the configuration found in the <code>pom.xml</code>:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>A <strong>Tomcat</strong> base image is selected when a <code>tomcat6-maven-plugin</code> or <code>tomcat7-maven-plugin</code> is present or when a <code>META-INF/context.xml</code> could be found in the classes directory.</p>\n</li>\n<li>\n<p>A <strong>Jetty</strong> base image is selected when a <code>jetty-maven-plugin</code> is present or one of the files <code>WEB-INF/jetty-web.xml</code> or <code>WEB-INF/jetty-logging.properties</code> is found.</p>\n</li>\n<li>\n<p>A <strong>Wildfly</strong> base image is chosen for a given <code>jboss-as-maven-plugin</code> or <code>wildfly-maven-plugin</code> or when a Wildfly specific deployment descriptor like <code>jboss-web.xml</code> is found.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>The base images chosen are:</p>\n</div>\n<table id=\"generator-webapp-from\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 33. Webapp Base Images</caption>\n<colgroup>\n<col style=\"width: 11.1111%;\">\n<col style=\"width: 44.4444%;\">\n<col style=\"width: 44.4445%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\"></th>\n<th class=\"tableblock halign-left valign-top\">Docker Build</th>\n<th class=\"tableblock halign-left valign-top\">S2I Build</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Tomcat</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-tomcat9-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-tomcat9-binary-s2i</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Jetty</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-jetty9-binary-s2i</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>quay.io/jkube/jkube-jetty9-binary-s2i</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Wildfly</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jboss/wildfly</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"https://github.com/wildfly/wildfly-s2i\"><code>quay.io/wildfly/wildfly-centos7</code></a></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>In addition to the <a href=\"#generator-options-common\">common generator options</a> this generator can be configured with the following options:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 34. Webapp configuration options</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>server</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Fix server to use in the base image. Can be either <strong>tomcat</strong>, <strong>jetty</strong> or <strong>wildfly</strong>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.server</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>targetDir</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where to put the war file into the target image. By default its selected by the base image chosen but can be\n overwritten with this option.</p>\n<p class=\"tableblock\"> Defaults to <code>/deployments</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.targetDir</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>user</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">User and/or group under which the files should be added. The syntax of this options is descriped in\n <a href=\"#config-image-build-assembly-user\">Assembly Configuration</a>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.user</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>path</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Context path with which the application can be reached by default.</p>\n<p class=\"tableblock\"> Defaults to <code>/</code> (root context).</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.path</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>cmd</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Command to use to start the container. By default the base images startup command is used.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.cmd</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>ports</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Comma separated list of ports to expose in the image and which eventually are translated later to Kubernetes services.\n The ports depend on the base image and are selected automatically. But they can be overridden here.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.generator.webapp.ports</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-quarkus\">7.1.8. Quarkus</h4>\n<div class=\"paragraph\">\n<p>The <code>Quarkus</code> generator tried to detect quarkus based projects looking at project <code>pom.xml</code>:</p>\n</div>\n<div class=\"paragraph\">\n<p>The base images chosen are:</p>\n</div>\n<table id=\"generator-quarkus-from\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 35. Webapp Base Images</caption>\n<colgroup>\n<col style=\"width: 11.1111%;\">\n<col style=\"width: 44.4444%;\">\n<col style=\"width: 44.4445%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\"></th>\n<th class=\"tableblock halign-left valign-top\">Docker Build</th>\n<th class=\"tableblock halign-left valign-top\">S2I Build</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Native</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>registry.access.redhat.com/ubi8/ubi-minimal:8.1</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">---</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>Normal Build</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>openjdk:11</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">---</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"admonitionblock important\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-important\" title=\"Important\"></i>\n</td>\n<td class=\"content\">\n<div class=\"paragraph\">\n<p>S2I builds are currently not yet supported for the Quarkus generator.</p>\n</div>\n</td>\n</tr>\n</table>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-openliberty\">7.1.9. Open Liberty</h4>\n<div class=\"paragraph\">\n<p>The Open Liberty generator runs when the Open Liberty plugin is enabled in the maven build.</p>\n</div>\n<div class=\"paragraph\">\n<p>The generator is similar to the <a href=\"#generator-java-exec\">java-exec generator</a>. It supports the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\"><code>java-exec</code> options</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>For Open Liberty, the default value of webPort is 9080.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"generator-wildfly-jar\">7.1.10. Wildfly JAR Generator</h4>\n<div class=\"paragraph\">\n<p>The Wildfly JAR generator detects a WildFly Bootable JAR build and disables the Jolokia and Prometheus Java agent TO BE REVISITED WHEN WE HAVE A SOLUTION.</p>\n</div>\n<div class=\"paragraph\">\n<p>Otherwise this generator is identical to the <a href=\"#generator-java-exec\">java-exec generator</a>. It supports the <a href=\"#generator-options-common\">common generator options</a> and the <a href=\"#generator-java-exec-options\"><code>java-exec</code> options</a>.</p>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"generators-api\">7.2. Generator API</h3>\n<div class=\"admonitionblock warning\">\n<table>\n<tr>\n<td class=\"icon\">\n<i class=\"fa icon-warning\" title=\"Warning\"></i>\n</td>\n<td class=\"content\">\nThe API is still a bit in flux and will be documented later. Please refer to the\n <a href=\"https://github.com/eclipse/jkube/blob/master/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/Generator.java\">Generator</a>\n Interface in the meantime.\n</td>\n</tr>\n</table>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"enrichers\">8. Enrichers</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Enriching is the complementary concept to <a href=\"#generators\">Generators</a>. Whereas Generators are used to create and customize Docker images, Enrichers are use to create and customize Kubernetes resource objects.</p>\n</div>\n<div class=\"paragraph\">\n<p>There are a lot of similarities to Generators:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Each Enricher has a unique name.</p>\n</li>\n<li>\n<p>Enrichers are looked up automatically from the plugin dependencies and there is a set of default enrichers delivered with this plugin.</p>\n</li>\n<li>\n<p>Enrichers are configured the same ways as generators</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>The <a href=\"#generator-example\">Generator example</a> is a good blueprint, simply replace <code>&lt;generator&gt;</code> with <code>&lt;enricher&gt;</code>. The configuration is structural identical:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 36. Enricher configuration</caption>\n<colgroup>\n<col style=\"width: 25%;\">\n<col style=\"width: 75%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;includes&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Contains one ore more <code>&lt;include&gt;</code> elements with enricher names which should be included. If given, only this list of enrichers are included in this order. The enrichers from every active profile are included, too. However the enrichers listed here are moved to the front of the list, so that they are called first. Use the profile <code>raw</code> if you want to explicitly set the complete list of enrichers.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;excludes&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Holds one or more <code>&lt;exclude&gt;</code> elements with enricher names to exclude. This means all the detected enrichers are used except the ones mentioned in this section.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>&lt;config&gt;</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Configuration for all enrichers. Each enricher supports a specific set of configuration values as described in its documentation. The subelements of this section are enricher names. E.g. for enricher <code>jkube-service</code>, the sub-element is called <code>&lt;jkube-service&gt;</code>. This element then holds the specific enricher configuration like <code>&lt;name&gt;</code> for the service name. Configuration coming from profiles are merged into this config, but not overriding the configuration specified here.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>This plugin comes with a set of default enrichers. In addition custom enrichers can be easily added by providing implementation of the <a href=\"#enricher-api\">Enricher API</a> and adding these as a dependency to the build.</p>\n</div>\n<div class=\"sect2\">\n<h3 id=\"enrichers-default\">8.1. Default Enrichers</h3>\n<div class=\"paragraph\">\n<p>openshift-maven-plugin comes with a set of enrichers which are enabled by default. There are two categories of default enrichers:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><a href=\"#enrichers-generic\"><strong>Generic Enrichers</strong></a> are used to add default resource object when they are missing or add common\nmetadata extracted from the given build information.</p>\n</li>\n<li>\n<p><a href=\"#enrichers-specific\"><strong>Specific Enrichers</strong></a> are enrichers which are focused on a certain tech stack that they detect.</p>\n</li>\n</ul>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 37. Default Enrichers Overview</caption>\n<colgroup>\n<col style=\"width: 22.2222%;\">\n<col style=\"width: 77.7778%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Enricher</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-configmap-file\">jkube-configmap-file</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add ConfigMap elements defined as XML or as annotation.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-controller\">jkube-controller</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Create default controller (replication controller, replica set or deployment <a href=\"https://kubernetes.io/docs/concepts/workloads/controllers/\">Kubernetes doc</a>) if missing.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-dependency\">jkube-dependency</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Examine build dependencies for <code>kubernetes.yml</code> and add the objects found therein.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-git\">jkube-git</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Check local <code>.git</code> directory and add build information as annotations.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-image\">jkube-image</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add the image name into a <code>PodSpec</code> of replication controller, replication sets and deployments, if missing.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-maven-issue-mgmt-enricher\">jkube-maven-issue-mgmt</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add Maven Issue Management information as annotations to the kubernetes/openshift resources</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-maven-scm-enricher\">jkube-maven-scm-enricher</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add Maven SCM information as annotations to the kubernetes/openshift resources</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-name\">jkube-name</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add a default name to every object which misses a name.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-pod-annotation\">jkube-pod-annotation</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Copy over annotations from a <code>Deployment</code> to a <code>Pod</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-portname\">jkube-portname</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add a default portname for commonly known service.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-project-label\">jkube-project-label</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add Maven coordinates as labels to all objects.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-prometheus\">jkube-prometheus</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add Prometheus annotations.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-revision-history-enricher\">jkube-revision-history</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add revision history limit (<a href=\"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#revision-history-limit\">Kubernetes doc</a>) as a deployment spec property to the Kubernetes/OpenShift resources.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-secret-file\">jkube-secret-file</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add Secret elements defined as annotation.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-service\">jkube-service</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Create a default service if missing and extract ports from the Docker image configuration.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-serviceaccount\">jkube-serviceaccount</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add a ServiceAccount defined as XML or mentioned in resource fragment.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><a href=\"#jkube-triggers-annotation\">jkube-triggers-annotation</a></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Add ImageStreamTag change triggers on Kubernetes resources such as StatefulSets, ReplicaSets and DaemonSets using the <code>image.openshift.io/triggers</code> annotation.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"sect3\">\n<h4 id=\"enrichers-generic\">8.1.1. Generic Enrichers</h4>\n<div class=\"paragraph\">\n<p>Default generic enrichers are used for adding missing resources or adding metadata to given resource objects.\nThe following default enhancers are available out of the box.</p>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-configmap-file\">jkube-configmap-file</h5>\n<div class=\"paragraph\">\n<p>This enricher adds ConfigMap defined as <code>resources</code> in plugin configuration and/or resolves file content from an annotation.</p>\n</div>\n<div class=\"paragraph\">\n<p>As XML you can define:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">pom.xml</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;resources&gt;\n &lt;configMap&gt;\n &lt;name&gt;myconfigmap&lt;/name&gt;\n &lt;entries&gt;\n &lt;entry&gt;\n &lt;name&gt;A&lt;/name&gt;\n &lt;value&gt;B&lt;/value&gt;\n &lt;/entry&gt;\n &lt;/entries&gt;\n &lt;/configMap&gt;\n &lt;/resources&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This creates a ConfigMap data with key <code>A</code> and value <code>B</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>You can also use <code>file</code> tag to refer to the content of a file.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;resources&gt;\n &lt;configMap&gt;\n &lt;name&gt;configmap-test&lt;/name&gt;\n &lt;entries&gt;\n &lt;entry&gt;\n &lt;file&gt;src/test/resources/test-application.properties&lt;/file&gt;\n &lt;/entry&gt;\n &lt;/entries&gt;\n &lt;/configMap&gt;\n &lt;/resources&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This creates a ConfigMap with key <code>test-application.properties</code> and value the content of the <code>src/test/resources/test-application.properties</code> file.\nIf you set <code>name</code> tag then this is used as key instead of the filename.</p>\n</div>\n<div class=\"paragraph\">\n<p>If you are defining a custom <code>ConfigMap</code> file, you can use an annotation to define a file name as key and its content as the value:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">metadata:\n name: ${project.artifactId}\n annotations:\n maven.jkube.io/cm/application.properties: src/test/resources/test-application.properties</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This creates a <code>ConfigMap</code> data with key <code>application.properties</code> (part defined after <code>cm</code>) and value the content of <code>src/test/resources/test-application.properties</code> file.</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-controller\">jkube-controller</h5>\n<div class=\"paragraph\">\n<p>This enricher is used to ensure that a controller is present.\nThis can be either directly configured with fragments or with the XML configuration.\nAn explicit configuration always takes precedence over auto detection.\nSee <a href=\"https://kubernetes.io/docs/concepts/workloads/controllers/\">Kubernetes doc</a> for more information on types of controllers.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following configuration parameters can be used to influence the behaviour of this enricher:</p>\n</div>\n<table id=\"enricher-jkube-controller\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 38. Default controller enricher</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Name of the Controller. Kubernetes Controller names must start with a letter. If the maven artifactId starts with a\n digit, <code>s</code> will be prefixed.</p>\n<p class=\"tableblock\"> Defaults to <code>${project.artifactId}</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-controller.name</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pullPolicy</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Image pull policy to use for the container. One of: <em>IfNotPresent</em>, <em>Always</em>.</p>\n<p class=\"tableblock\"> Defaults to <code>IfNotPresent</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-controller.pullPolicy</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>type</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Type of Controller to create. One of: <em>ReplicationController</em>, <em>ReplicaSet</em>, <em>Deployment</em>, <em>DeploymentConfig</em>,\n <em>StatefulSet</em>, <em>DaemonSet</em>, <em>Job</em>.</p>\n<p class=\"tableblock\"> Defaults to <code>Deployment</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-controller.type</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>replicaCount</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Number of replicas for the container.</p>\n<p class=\"tableblock\"> Defaults to <code>1</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-controller.replicaCount</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-service\">jkube-service</h5>\n<div class=\"paragraph\">\n<p>This enricher is used to ensure that a service is present.\nThis can be either directly configured with fragments or with the XML configuration, but it can be also automatically inferred by looking at the ports exposed by an image configuration.\nAn explicit configuration always takes precedence over auto detection. For enriching an existing service this enricher actually works only on a configured service which matches with the configured (or inferred) service name.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following configuration parameters can be used to influence the behaviour of this enricher:</p>\n</div>\n<table id=\"enricher-jkube-service\" class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 39. Default service enricher</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Service name to enrich by default. If not given here or configured elsewhere, the artifactId is used.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.name</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>headless</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Whether a headless service without a port should be configured. A headless service has the <code>ClusterIP</code> set to <code>None</code>\n and will be only used if no ports are exposed by the image configuration or by the configuration <code>port</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.headless</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>expose</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">If set to true, a label <code>expose</code> with value <code>true</code> is added which can be picked up by the jkube.\n <a href=\"https://github.com/jenkins-x/exposecontroller\">expose-controller</a> to expose the service to the outside by various means.\n See the documentation of expose-controller for more details.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.expose</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>type</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Kubernetes / OpenShift service type to set like <em>LoadBalancer</em>, <em>NodePort</em> or <em>ClusterIP</em>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.type</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>port</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The service port to use. By default the same port as the ports exposed in the image configuration is used, but can be\n changed with this parameter. See <a href=\"#jkube-service-ports\">below</a> for a detailed description of the format which can be\n put into this variable.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.port</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>multiPort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Set this to <code>true</code> if you want all ports to be exposed from an image configuration. Otherwise only the first port is\n used as a service port.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.multiPort</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>protocol</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Default protocol to use for the services. Must be <code>tcp</code> or <code>udp</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>tcp</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.protocol</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>normalizePort</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Normalize the port numbering of the service to common and conventional port numbers.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-service.normalizePort</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Following is the Port mapping that comes in effect, when normalizePort option is set true.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 50%;\">\n<col style=\"width: 50%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Original Port</th>\n<th class=\"tableblock halign-left valign-top\">Normalized Port</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">8080</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">80</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">8081</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">80</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">8181</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">80</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">8180</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">80</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">8443</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">443</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">443</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">443</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>You specify the properties like for any enricher within the enrichers configuration like in</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;!-- ... --&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-service&gt;\n &lt;name&gt;my-service&lt;/name&gt;\n &lt;type&gt;NodePort&lt;/type&gt;\n &lt;multiPort&gt;true&lt;/multiPort&gt;\n &lt;/jkube-service&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div id=\"jkube-service-ports\" class=\"paragraph\">\n<div class=\"title\">Port specification</div>\n<p>With the option <code>port</code> you can influence the mapping how ports are mapped from the pod to the service.\nBy default and if this option is not given the ports exposed are dictated by the ports exposed from the Docker images contained in the pods.\nRemember, each image configured can be part of the pod.\nHowever you can expose also completely different ports as the images meta data declare.</p>\n</div>\n<div class=\"paragraph\">\n<p>The property <code>port</code> can contain a comma separated list of mappings of the following format:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-text\" data-lang=\"text\">&lt;servicePort1&gt;:&lt;targetPort1&gt;/&lt;protocol&gt;,&lt;servicePort2&gt;:&lt;targetPort2&gt;/&lt;protocol&gt;,....</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>where the <code>targetPort</code> and <code>&lt;protocol&gt;</code> specification is optional. These ports are overlayed over the ports exposed by the images, in the given order.</p>\n</div>\n<div class=\"paragraph\">\n<p>This is best explained by some examples.</p>\n</div>\n<div class=\"paragraph\">\n<p>For example if you have a pod which exposes a Microservice on port 8080 and you want to expose it as a service on port 80 (so that it can be accessed with <code><a href=\"http://myservice\" class=\"bare\">http://myservice</a></code>) you can simply use the following enricher configuration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-service&gt;\n &lt;name&gt;myservice&lt;/name&gt;\n &lt;port&gt;80:8080&lt;/port&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;/jkube-service&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>80 is the service port, 8080 the port opened in from the pod&#8217;s images</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>If your pod <em>exposes</em> their ports (which e.g. all generator do), then you can even omit the 8080 here (i.e. <code>&lt;port&gt;80&lt;/port&gt;</code>).\nIn this case the <em>first</em> port exposed will be mapped to port 80, all other exposed ports will be omitted.</p>\n</div>\n<div class=\"paragraph\">\n<p>By default an automatically generated service only exposes the first port, even when more ports are exposed.\nWhen you want to map multiple ports you need to set the config option <code>&lt;multiPort&gt;true&lt;/multiPort&gt;</code>.\nIn this case you can also provide multiple mappings as a comma separated list in the <code>&lt;port&gt;</code> specification where each element of the list are the mapping for the first, second, &#8230;&#8203; port.</p>\n</div>\n<div class=\"paragraph\">\n<p>A more (and bit artificially constructed) specification could be <code>&lt;port&gt;80,9779:9779/udp,443&lt;/port&gt;</code>.\nAssuming that the image exposes ports <code>8080</code> and <code>8778</code> (either directly or via <a href=\"#generators\">generators</a>) and we have switched on multiport mode, then the following service port mappings will be performed for the automatically generated service:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Pod port 8080 is mapped to service port 80.</p>\n</li>\n<li>\n<p>Pod port 9779 is mapped to service port 9779 with protocol UDP. Note how this second entry overrides the pod exposed port 8778.</p>\n</li>\n<li>\n<p>Pod port 443 is mapped to service port 443.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>This example shows also the mapping rules:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Port specification in <code>port</code> always override the port metadata of the contained Docker images (i.e. the ports exposed)</p>\n</li>\n<li>\n<p>You can always provide a complete mapping with <code>port</code> on your own</p>\n</li>\n<li>\n<p>The ports exposed by the images serve as <em>default values</em> which are used if not specified by this configuration option.</p>\n</li>\n<li>\n<p>You can map ports which are <em>not</em> exposed by the images by specifying them as target ports.</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Multiple ports are <strong>only</strong> mapped when <em>multiPort</em> mode is enabled (which is switched off by default). If <em>multiPort</em> mode is disabled, only the first port from the list of mapped ports calculated as above is taken.</p>\n</div>\n<div class=\"paragraph\">\n<p>When you set <code>legacyPortMapping</code> to true than ports 8080 to 9090 are mapped to port 80 automatically if not explicitly mapped via <code><em>port</em></code>. I.e. when an image exposes port 8080 with a legacy mapping this mapped to a service port 80, not 8080. You <em>should not</em> switch this on for any good reason. In fact it might be that this option can vanish anytime.</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-image\">jkube-image</h5>\n\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-name\">jkube-name</h5>\n\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-portname\">jkube-portname</h5>\n\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-pod-annotation\">jkube-pod-annotation</h5>\n\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-project-label\">jkube-project-label</h5>\n<div class=\"paragraph\">\n<p>Enricher that adds standard labels and selectors to generated resources (e.g. <code>app</code>, <code>group</code>, <code>provider</code>, <code>version</code>).</p>\n</div>\n<div class=\"paragraph\">\n<p>The <code>jkube-project-label</code> enricher supports the following configuration options:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Option</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>useProjectLabel</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Enable this flag to turn on the generation of the old <code>project</code> label in Kubernetes resources. The <code>project</code> label has\nbeen replaced by the <code>app</code> label in newer versions of the plugin.</p>\n<p class=\"tableblock\"> Defaults to <code>false</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-project-label.useProjectLabel</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>app</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Makes it possible to define a custom <code>app</code> label used in the generated resource files used for deployment.</p>\n<p class=\"tableblock\">Defaults to the Maven <code>project.artifactId</code> property.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-project-label.app</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>The project labels which are already specified in the input fragments are not overridden by the enricher.</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-git\">jkube-git</h5>\n<div class=\"paragraph\">\n<p>Enricher that adds info from .git directory as annotations.</p>\n</div>\n<div class=\"paragraph\">\n<p>The git branch &amp; latest commit on the branch are annotated as <code>jkube.io/git-branch</code> &amp; <code>jkube.io/git-commit</code>.\n<code>jkube.io/git-url</code> is annotated as the URL of your configured remote.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Option</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>gitRemote</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Configures the git remote name, whose URL you want to annotate as 'git-url'.</p>\n<p class=\"tableblock\"> Defaults to <code>origin</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-git.gitRemote</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-dependency\">jkube-dependency</h5>\n\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-volume-permission\">jkube-volume-permission</h5>\n<div class=\"paragraph\">\n<p>Enricher which fixes the permission of persistent volume mount with the help of an init container.</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-openshift-autotls\">jkube-openshift-autotls</h5>\n<div class=\"paragraph\">\n<p>Enricher which adds appropriate annotations and volumes to enable OpenShift&#8217;s automatic\n<a href=\"https://docs.openshift.org/latest/dev_guide/secrets.html#service-serving-certificate-secrets\">Service Serving Certificate Secrets</a>.\nThis enricher adds an init container to convert the service serving certificates from PEM (the format that OpenShift generates them in) to\na JKS-format Java keystore ready for consumption in Java services.</p>\n</div>\n<div class=\"paragraph\">\n<p>This enricher is disabled by default. In order to use it, you must configure the openshift-maven-plugin to use this enricher:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;includes&gt;\n &lt;include&gt;jkube-openshift-autotls&lt;/include&gt;\n &lt;/includes&gt;\n &lt;config&gt;\n &lt;jkube-openshift-autotls&gt;\n &lt;!-- ... --&gt;\n &lt;/jkube-openshift-autotls&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The auto-TLS enricher supports the following configuration options:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 75%;\">\n<col style=\"width: 12.5%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tlsSecretName</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name of the secret to be used to store the generated service serving certs.</p>\n<p class=\"tableblock\"> Defaults to <code>&lt;project.artifactId&gt;-tls</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.tlsSecretName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tlsSecretVolumeMountPoint</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where the service serving secret should be mounted to in the pod.</p>\n<p class=\"tableblock\"> Defaults to <code>/var/run/secrets/jkube.io/tls-pem</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.tlsSecretName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>tlsSecretVolumeName</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name of the secret volume.</p>\n<p class=\"tableblock\"> Defaults to <code>tls-pem</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.tlsSecretVolumeName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>jksVolumeMountPoint</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Where the generated keystore volume should be mounted to in the pod.</p>\n<p class=\"tableblock\"> Defaults to <code>/var/run/secrets/jkube.io/tls-jks</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.the</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>jksVolumeName</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name of the keystore volume.</p>\n<p class=\"tableblock\"> Defaults to <code>tls-jks</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.jksVolumeName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pemToJKSInitContainerImage</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name of the image used as an init container to convert PEM certificate/key to Java keystore.</p>\n<p class=\"tableblock\"> Defaults to <code>jimmidyson/pemtokeystore:v0.1.0</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.pemToJKSInitContainerImage</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>pemToJKSInitContainerName</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">the name of the init container to convert PEM certificate/key to Java keystore.</p>\n<p class=\"tableblock\"> Defaults to <code>tls-jks-converter</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.pemToJKSInitContainerName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keystoreFileName</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The name of the generated keystore file.</p>\n<p class=\"tableblock\"> Defaults to <code>keystore.jks</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.keystoreFileName</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keystorePassword</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The password to use for the generated keystore.</p>\n<p class=\"tableblock\"> Defaults to <code>changeit</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.keystorePassword</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>keystoreCertAlias</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The alias in the keystore used for the imported service serving certificate.</p>\n<p class=\"tableblock\"> Defaults to <code>server</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-openshift-autotls.keystoreCertAlias</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-prometheus\">jkube-prometheus</h5>\n<div class=\"paragraph\">\n<p>This enricher adds Prometheus annotation like:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">apiVersion: v1\nkind: List\nitems:\n- apiVersion: v1\n kind: Service\n metadata:\n annotations:\n prometheus.io/scrape: \"true\"\n prometheus.io/port: 9779\n prometheus.io/path: \"/metrics\"</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>By default the enricher inspects the images' BuildConfiguration and add the annotations if the port 9779 is listed.\nYou can force the plugin to add annotations by setting enricher&#8217;s config <code><code>prometheusPort</code></code></p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-maven-scm-enricher\">jkube-maven-scm-enricher</h5>\n<div class=\"paragraph\">\n<p>This enricher adds additional <a href=\"https://maven.apache.org/pom.html#SCM\">SCM</a> related metadata to all objects supporting annotations.\nThese metadata will be added only if <a href=\"https://maven.apache.org/pom.html#SCM\">SCM</a> information is present in the maven <code>pom.xml</code> of the project.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following annotations will be added to the objects that supports annotations,</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 40. Maven SCM Enrichers Annotation Mapping</caption>\n<colgroup>\n<col style=\"width: 28.5714%;\">\n<col style=\"width: 28.5714%;\">\n<col style=\"width: 42.8572%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Maven SCM Info</th>\n<th class=\"tableblock halign-left valign-top\">Annotation</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">scm/connection</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/scm-con-url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The SCM connection that will be used to connect to the project&#8217;s SCM</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">scm/developerConnection</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/scm-devcon-url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The SCM Developer Connection that will be used to connect to the project&#8217;s developer SCM</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">scm/tag</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/scm-tag</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The SCM tag that will be used to checkout the sources, like HEAD dev-branch etc.,</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">scm/url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/scm-url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The SCM web url that can be used to browse the SCM over web browser</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Lets say you have a maven pom.xml with the following scm information,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;scm&gt;\n &lt;connection&gt;scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git&lt;/connection&gt;\n &lt;developerConnection&gt;scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git&lt;/developerConnection&gt;\n &lt;url&gt;git://github.com/jkubeio/kubernetes-maven-plugin.git&lt;/url&gt;\n&lt;/scm&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This information will be enriched as annotations in the generated manifest like,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\"># ...\n kind: Service\n metadata:\n annotations\n jkube.io/scm-con-url: \"scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git\"\n jkube.io/scm-devcon-url: \"scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git\"\n jkube.io/scm-tag: \"HEAD\"\n jkube.io/scm-url: \"git://github.com/jkubeio/kubernetes-maven-plugin.git\"\n# ...</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-maven-issue-mgmt-enricher\">jkube-maven-issue-mgmt</h5>\n<div class=\"paragraph\">\n<p>This enricher adds additional <a href=\"https://maven.apache.org/pom.html#Issue_Management\">Issue Management</a> related metadata to\nall objects supporting annotations.\nThese metadata will be added only if the <a href=\"https://maven.apache.org/pom.html#Issue_Management\">Issue Management</a>\ninformation is available in the <code>pom.xml</code> of the Maven project.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following annotations will be added to the objects that support these annotations,</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 41. Maven Issue Tracker Enrichers Annotation Mapping</caption>\n<colgroup>\n<col style=\"width: 28.5714%;\">\n<col style=\"width: 28.5714%;\">\n<col style=\"width: 42.8572%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Maven Issue Tracker Info</th>\n<th class=\"tableblock halign-left valign-top\">Annotation</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">issueManagement/system</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/issue-system</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Issue Management system like Bugzilla, JIRA, GitHub etc.,</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">issueManagement/url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">jkube.io/issue-tracker-url</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The Issue Management url e.g. GitHub Issues Url</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Lets say you have a maven pom.xml with the following issue management information,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;issueManagement&gt;\n &lt;system&gt;GitHub&lt;/system&gt;\n &lt;url&gt;https://github.com/reactiverse/vertx-maven-plugin/issues/&lt;/url&gt;\n&lt;/issueManagement&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This information will be enriched as annotations in the generated manifest like,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\"># ...\n kind: Service\n metadata:\n annotations:\n jkube.io/issue-system: \"GitHub\"\n jkube.io/issue-tracker-url: \"https://github.com/reactiverse/vertx-maven-plugin/issues/\"\n# ...</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-revision-history-enricher\">jkube-revision-history</h5>\n<div class=\"paragraph\">\n<p>This enricher adds <code>spec.revisionHistoryLimit</code> property to deployment spec of Kubernetes/OpenShift resources.\nA deployment’s revision history is stored in the replica sets, that specifies the number of old ReplicaSets to retain in order to allow rollback.\nFor more information read <a href=\"https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#revision-history-limit\">Kubernetes documentation</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>The following configuration parameters can be used to influence the behaviour of this enricher:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 42. Default revision history enricher</caption>\n<colgroup>\n<col style=\"width: 20%;\">\n<col style=\"width: 40%;\">\n<col style=\"width: 40%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>limit</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Number of revision histories to retain.</p>\n<p class=\"tableblock\"> Defaults to <code>2</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>jkube.enricher.jkube-revision-history.limit</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Just as any other enricher you can specify required properties with in the enricher&#8217;s configuration as below,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;!-- ... --&gt;\n&lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-revision-history&gt;\n &lt;limit&gt;8&lt;/limit&gt;\n &lt;/jkube-revision-history&gt;\n &lt;/config&gt;\n&lt;/enricher&gt;\n&lt;!-- ... --&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This information will be enriched as spec property in the generated manifest like,</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\"># ...\nkind: Deployment\nspec:\n revisionHistoryLimit: 8\n# ...</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-triggers-annotation\">jkube-triggers-annotation</h5>\n<div class=\"paragraph\">\n<p>This enricher adds ImageStreamTag change triggers on Kubernetes resources that support the <code>image.openshift.io/triggers</code> annotation, such as StatefulSets, ReplicaSets and DaemonSets.</p>\n</div>\n<div class=\"paragraph\">\n<p>The trigger is added to all containers that apply, but can be restricted to a limited set of containers using the following configuration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;!-- ... --&gt;\n&lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-triggers-annotation&gt;\n &lt;containers&gt;container-name-1,c2&lt;/containers&gt;\n &lt;/jkube-triggers-annotation&gt;\n &lt;/config&gt;\n&lt;/enricher&gt;\n&lt;!-- ... --&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-secret-file\">jkube-secret-file</h5>\n<div class=\"paragraph\">\n<p>This enricher adds Secret defined as file content from an annotation.</p>\n</div>\n<div class=\"paragraph\">\n<p>If you are defining a custom <code>Secret</code> file, you can use an annotation to define a file name as key and its content as the value:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">metadata:\n name: ${project.artifactId}\n annotations:\n maven.jkube.io/secret/application.properties: src/test/resources/test-application.properties</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This creates a <code>Secret</code> data with the key <code>application.properties</code> (part defined after <code>secret</code>) and value content of\n<code>src/test/resources/test-application.properties</code> file (base64 encoded).</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-serviceaccount\">jkube-serviceaccount</h5>\n\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"enrichers-specific\">8.1.2. Specific Enrichers</h4>\n<div class=\"paragraph\">\n<p>Specific enrichers provide resource manifest enhancement for a certain tech stack that they detect.</p>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-karaf\">jkube-healthcheck-karaf</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with Apache Karaf. This requires that\n<code>jkube.karaf-checks</code> has been enabled in the Karaf startup features.</p>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>8181</code></p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>failureThreshold = <code>3</code></p>\n</li>\n<li>\n<p>successThreshold = <code>1</code></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>and use paths <code>/readiness-check</code> for readiness check and <code>/health-check</code> for liveness check.</p>\n</div>\n<div class=\"paragraph\">\n<p>These options cannot be configured.</p>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-spring-boot\">jkube-healthcheck-spring-boot</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with Spring Boot. This requires the following dependency\nhas been enabled in Spring Boot</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;\n&lt;/dependency&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will try to discover the settings from the <code>application.properties</code> / <code>application.yaml</code> Spring Boot configuration file.</p>\n</div>\n<div class=\"paragraph\">\n<p>The port number is read from the <code>management.port</code> option, and will use the default value of <code>8080</code>\nThe scheme will use HTTPS if <code>server.ssl.key-store</code> option is in use, and fallback to use <code>HTTP</code> otherwise.</p>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p><code>readinessProbeInitialDelaySeconds</code> : <code>10</code></p>\n</li>\n<li>\n<p><code>readinessProbePeriodSeconds</code> : <em>&lt;kubernetes-default&gt;</em></p>\n</li>\n<li>\n<p><code>livenessProbeInitialDelaySeconds</code> : <code>180</code></p>\n</li>\n<li>\n<p><code>livenessProbePeriodSeconds</code> : <em>&lt;kubernetes-default&gt;</em></p>\n</li>\n<li>\n<p><code>timeoutSeconds</code> : <em>&lt;kubernetes-default&gt;</em></p>\n</li>\n<li>\n<p><code>failureThreshold</code>: <code>3</code></p>\n</li>\n<li>\n<p><code>successThreshold</code>: <code>1</code></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>These values can be configured by the enricher in the <code>openshift-maven-plugin</code> configuration as shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-spring-boot&gt;\n &lt;timeoutSeconds&gt;5&lt;/timeoutSeconds&gt;\n &lt;readinessProbeInitialDelaySeconds&gt;30&lt;/readinessProbeInitialDelaySeconds&gt;\n &lt;failureThreshold&gt;3&lt;/failureThreshold&gt;\n &lt;successThreshold&gt;1&lt;/successThreshold&gt;\n &lt;/jkube-healthcheck-spring-boot&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-thorntail-v2\">jkube-healthcheck-thorntail-v2</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with Thorntail v2. This requires the following fraction\nhas been enabled in Thorntail</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;dependency&gt;\n &lt;groupId&gt;io.thorntail&lt;/groupId&gt;\n &lt;artifactId&gt;microprofile-health&lt;/artifactId&gt;\n&lt;/dependency&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>8080</code></p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>path = <code>/health</code></p>\n</li>\n<li>\n<p>failureThreshold = <code>3</code></p>\n</li>\n<li>\n<p>successThreshold = <code>1</code></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>These values can be configured by the enricher in the <code>openshift-maven-plugin</code> configuration as shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-thorntail&gt;\n &lt;port&gt;4444&lt;/port&gt;\n &lt;scheme&gt;HTTPS&lt;/scheme&gt;\n &lt;path&gt;health/myapp&lt;/path&gt;\n &lt;failureThreshold&gt;3&lt;/failureThreshold&gt;\n &lt;successThreshold&gt;1&lt;/successThreshold&gt;\n &lt;/jkube-healthcheck-thorntail&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-vertx\">jkube-healthcheck-vertx</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with Eclipse Vert.x applications.\nThe readiness probe lets Kubernetes detect when the application is ready, while the liveness probe allows Kubernetes to\nverify that the application is still alive.</p>\n</div>\n<div class=\"paragraph\">\n<p>This enricher allows configuring the readiness and liveness probes. The following probe types are supported:\n<code>http</code> (emit HTTP requests), <code>tcp</code> (open a socket), <code>exec</code> (execute a command).</p>\n</div>\n<div class=\"paragraph\">\n<p>By default, this enricher uses the same configuration for liveness and readiness probes. But specific configurations can\nbe provided too. The configurations can be overridden using project&#8217;s properties.</p>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_using_the_jkube_healthcheck_vertx_enricher\">Using the jkube-healthcheck-vertx enricher</h6>\n<div class=\"paragraph\">\n<p>The enricher is automatically executed if your project uses the <code>vertx-maven-plugin</code> or depends on <code>io.vertx:vertx-core</code>.\nHowever, by default, no health check will be added to your deployment unless configured explicitly.</p>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_minimal_configuration\">Minimal configuration</h6>\n<div class=\"paragraph\">\n<p>The minimal configuration to add health checks is the following:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;path&gt;/health&lt;/path&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>It configures the readiness and liveness health checks using HTTP requests on the port <code>8080</code> (default port) and on the\npath <code>/health</code>. The defaults are:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>8080</code> (for HTTP)</p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>path = <em>none</em> (disabled)</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>the previous configuration can also be given use project&#8217;s properties:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;properties&gt;\n &lt;vertx.health.path&gt;/health&lt;/vertx.health.path&gt;\n&lt;/properties&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_configuring_differently_the_readiness_and_liveness_health_checks\">Configuring differently the readiness and liveness health checks</h6>\n<div class=\"paragraph\">\n<p>You can provide two different configuration for the readiness and liveness checks:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;readiness&gt;\n &lt;path&gt;/ready&lt;/path&gt;\n &lt;/readiness&gt;\n &lt;liveness&gt;\n &lt;path&gt;/health&lt;/path&gt;\n &lt;/liveness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>You can also use the <code>readiness</code> and <code>liveness</code> chunks in user properties:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;properties&gt;\n &lt;vertx.health.readiness.path&gt;/ready&lt;/vertx.health.readiness.path&gt;\n &lt;vertx.health.liveness.path&gt;/ready&lt;/vertx.health.liveness.path&gt;\n&lt;/properties&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Shared (generic) configuration can be set outside of the specific configuration. For instance, to use the port 8081:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;port&gt;8081&lt;/port&gt;\n &lt;readiness&gt;\n &lt;path&gt;/ready&lt;/path&gt;\n &lt;/readiness&gt;\n &lt;liveness&gt;\n &lt;path&gt;/health&lt;/path&gt;\n &lt;/liveness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Or:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;properties&gt;\n &lt;vertx.health.port&gt;8081&lt;/vertx.health.port&gt;\n &lt;vertx.health.readiness.path&gt;/ready&lt;/vertx.health.readiness.path&gt;\n &lt;vertx.health.liveness.path&gt;/ready&lt;/vertx.health.liveness.path&gt;\n&lt;/properties&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_configuration_structure\">Configuration Structure</h6>\n<div class=\"paragraph\">\n<p>The configuration is structured as follows</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;!-- Generic configuration, applied to both liveness and readiness --&gt;\n &lt;path&gt;/both&lt;/path&gt;\n &lt;liveness&gt;\n &lt;!-- Specific configuration for the liveness probe --&gt;\n &lt;port-name&gt;ping&lt;/port-name&gt;\n &lt;/liveness&gt;\n &lt;readiness&gt;\n &lt;!-- Specific configuration for the readiness probe --&gt;\n &lt;port-name&gt;ready&lt;/port-name&gt;\n &lt;/readiness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n&lt;/config&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The same structure is used in project&#8217;s properties:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;properties&gt;\n &lt;!-- Generic configuration given as vertx.health.$attribute --&gt;\n &lt;vertx.health.path&gt;/both&lt;/vertx.health.path&gt;\n &lt;!-- Specific liveness configuration given as vertx.health.liveness.$attribute --&gt;\n &lt;vertx.health.liveness.port-name&gt;ping&lt;/vertx.health.liveness.port-name&gt;\n &lt;!-- Specific readiness configuration given as vertx.health.readiness.$attribute --&gt;\n &lt;vertx.health.readiness.port-name&gt;ready&lt;/vertx.health.readiness.port-name&gt;\n&lt;/properties&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p><strong>Important</strong>: Project&#8217;s plugin configuration override the project&#8217;s properties.\nThe overriding rules are:\n<em>specific configuration</em> &gt; <em>specific properties</em> &gt; <em>generic configuration</em> &gt; <em>generic properties</em>.</p>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_probe_configuration\">Probe configuration</h6>\n<div class=\"paragraph\">\n<p>You can configure the different aspects of the probes. These attributes can be configured for both the readiness and\nliveness probes or be specific to one.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 43. Vert.x HealthCheck Enricher probe configuration</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 62.5%;\">\n<col style=\"width: 25%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>type</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The probe type among <code>http</code> (default), <code>tcp</code> and <code>exec</code>.</p>\n<p class=\"tableblock\"> Defaults to <code>http</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.type</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.type</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>initial-delay</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Number of seconds after the container has started before probes are initiated.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.initial-delay</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.initial-delay</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>period</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">How often (in seconds) to perform the probe.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.period</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.period</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>timeout</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Number of seconds after which the probe times out.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.timeout</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.timeout</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>success-threshold</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Minimum consecutive successes for the probe to be considered successful after having failed.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.success-threshold</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.success-threshold</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>failure-threshold</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Minimum consecutive failures for the probe to be considered failed after having succeeded.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.failure-threshold</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.failure-threshold</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>More details about probes are available on <a href=\"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/\" class=\"bare\">https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/</a>.</p>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_http_specific_probe_configuration\">HTTP specific probe configuration</h6>\n<div class=\"paragraph\">\n<p>When using HTTP <code>GET</code> requests to determine readiness or liveness, several aspects can be configured. HTTP probes are used by default. To be more specific set the <code>type</code> attribute to <code>http</code>.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 44. Vert.x HealthCheck Enricher HTTP probe configuration</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 62.5%;\">\n<col style=\"width: 25%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>scheme</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Scheme to use for connecting to the host.</p>\n<p class=\"tableblock\"> Defaults to <code>HTTP</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.scheme</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.scheme</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>path</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Path to access on the HTTP server. An empty path disable the check.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.path</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.path</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>headers</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Custom headers to set in the request. HTTP allows repeated headers. It cannot be configured using project&#8217;s properties.\n An example is available below.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.headers</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.headers</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>port</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port number to access the container. A 0 or negative number disables the check.</p>\n<p class=\"tableblock\"> Defaults to <code>8080</code>.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.port</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.port</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>port-name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Name of the port to access on the container. If neither the <code>port</code> nor the <code>port-name</code> is set, the check is disabled.\n If both are set the configuration is considered invalid.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.port-name</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.port-name</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>Here is an example of HTTP probe configuration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;initialDelay&gt;3&lt;/initialDelay&gt;\n &lt;period&gt;3&lt;/period&gt;\n &lt;liveness&gt;\n &lt;port&gt;8081&lt;/port&gt;\n &lt;path&gt;/ping&lt;/path&gt;\n &lt;scheme&gt;HTTPS&lt;/scheme&gt;\n &lt;headers&gt;\n &lt;X-Custom-Header&gt;Awesome&lt;/X-Custom-Header&gt;\n &lt;/headers&gt;\n &lt;/liveness&gt;\n &lt;readiness&gt;\n &lt;!-- disable the readiness probe --&gt;\n &lt;port&gt;-1&lt;/port&gt;\n &lt;/readiness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n&lt;/config&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_tcp_specific_probe_configuration\">TCP specific probe configuration</h6>\n<div class=\"paragraph\">\n<p>You can also configure the probes to just open a socket on a specific port. The <code>type</code> attribute must be set to <code>tcp</code>.</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 45. Vert.x HealthCheck Enricher TCP probe configuration</caption>\n<colgroup>\n<col style=\"width: 12.5%;\">\n<col style=\"width: 62.5%;\">\n<col style=\"width: 25%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n<th class=\"tableblock halign-left valign-top\">Property</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>port</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Port number to access the container. A 0 or negative number disables the check.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.port</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.port</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>port-name</code></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Name of the port to access on the container. If neither the <code>port</code> nor the <code>port-name</code> is set, the check is disabled.\n If both are set the configuration is considered invalid.</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>vertx.health.port-name</code></p>\n<p class=\"tableblock\"> <code>jkube.enricher.jkube-healthcheck-vertx.port-name</code></p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"paragraph\">\n<p>For example:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;initialDelay&gt;3&lt;/initialDelay&gt;\n &lt;period&gt;3&lt;/period&gt;\n &lt;liveness&gt;\n &lt;type&gt;tcp&lt;/type&gt;\n &lt;port&gt;8081&lt;/port&gt;\n &lt;/liveness&gt;\n &lt;readiness&gt;\n &lt;!-- use HTTP Get probe --&gt;\n &lt;path&gt;/ping&lt;/path&gt;\n &lt;port&gt;8080&lt;/port&gt;\n &lt;/readiness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n&lt;/config&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_exec_probe_configuration\">Exec probe configuration</h6>\n<div class=\"paragraph\">\n<p>You can also configure the probes to execute a command. If the command succeeds, it returns 0, and Kubernetes consider the pod to be alive and healthy. If the command returns a non-zero value, Kubernetes kills the pod and restarts it. To use a command, you must set the <code>type</code> attribute to <code>exec</code>:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;config&gt;\n &lt;jkube-healthcheck-vertx&gt;\n &lt;initialDelay&gt;3&lt;/initialDelay&gt;\n &lt;period&gt;3&lt;/period&gt;\n &lt;liveness&gt;\n &lt;type&gt;exec&lt;/type&gt;\n &lt;command&gt;\n &lt;cmd&gt;cat&lt;/cmd&gt;\n &lt;cmd&gt;/tmp/healthy&lt;/cmd&gt;\n &lt;/command&gt;\n &lt;/liveness&gt;\n &lt;readiness&gt;\n &lt;-- use HTTP Get probe --&gt;\n &lt;path&gt;/ping&lt;/path&gt;\n &lt;port&gt;8080&lt;/port&gt;\n &lt;/readiness&gt;\n &lt;/jkube-healthcheck-vertx&gt;\n&lt;/config&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>As you can see in the snippet above the command is passed using the <code>command</code> attribute. This attribute cannot be\nconfigured using project&#8217;s properties. An empty command disables the check.</p>\n</div>\n</div>\n<div class=\"sect5\">\n<h6 id=\"_disabling_health_checks\">Disabling health checks</h6>\n<div class=\"paragraph\">\n<p>You can disable the checks by setting:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>the <code>port</code> to 0 or to a negative number for <code>http</code> and <code>tcp</code> probes</p>\n</li>\n<li>\n<p>the <code>command</code> to an empty list for <code>exec</code></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>In the first case, you can use project&#8217;s properties to disable them:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;!-- Disables <code>tcp</code> and <code>http</code> probes --&gt;\n&lt;vertx.health.port&gt;-1&lt;/vertx.health.port&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>For <code>http</code> probes, an empty or not set <code>path</code> also disable the probe.</p>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-webapp\">jkube-healthcheck-webapp</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with WebApp. This requires that you have <code>maven-war-plugin</code> set.</p>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>8080</code></p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>path = ``</p>\n</li>\n<li>\n<p>initialReadinessDelay = 10</p>\n</li>\n<li>\n<p>initialLivenessDelay = 180</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>If <code>path</code> attribute is not set (default value) then this enricher is disabled.</p>\n</div>\n<div class=\"paragraph\">\n<p>These values can be configured by the enricher in the <code>openshift-maven-plugin</code> configuration as shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-webapp&gt;\n &lt;path&gt;/&lt;/path&gt;\n &lt;/jkube-healthcheck-webapp&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n &lt;!-- ... --&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-wildfly-swarm\">jkube-healthcheck-wildfly-swarm</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes with WildFly Swarm. This requires the following fraction\nhas been enabled in WildFly Swarm</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;dependency&gt;\n &lt;groupId&gt;org.wildfly.swarm&lt;/groupId&gt;\n &lt;artifactId&gt;microprofile-health&lt;/artifactId&gt;\n&lt;/dependency&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>8080</code></p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>path = <code>/health</code></p>\n</li>\n<li>\n<p>failureThreshold = <code>3</code></p>\n</li>\n<li>\n<p>successThreshold = <code>1</code></p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>These values can be configured by the enricher in the <code>openshift-maven-plugin</code> configuration as shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;helm&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-wildfly-swarm&gt;\n &lt;port&gt;4444&lt;/port&gt;\n &lt;scheme&gt;HTTPS&lt;/scheme&gt;\n &lt;path&gt;health/myapp&lt;/path&gt;\n &lt;failureThreshold&gt;3&lt;/failureThreshold&gt;\n &lt;successThreshold&gt;1&lt;/successThreshold&gt;\n &lt;/jkube-healthcheck-wildfly-swarm&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect4\">\n<h5 id=\"jkube-healthcheck-wildfly-jar\">jkube-healthcheck-wildfly-jar</h5>\n<div class=\"paragraph\">\n<p>This enricher adds kubernetes readiness and liveness probes to WildFly JAR applications. Probes depend on the WildFly <em>microprofile-health</em> subsystem\n<em>/health/ready</em> and <em>/health/live</em> endpoints.\nWhen the WildFly Bootable JAR Maven plugin is configured with the <em>&lt;cloud&gt;</em> configuration item, <em>microprofile_health</em> subsystem\nis enforced in the bootable JAR server configuration.</p>\n</div>\n<div class=\"paragraph\">\n<p>This enricher looks for the <em>&lt;cloud&gt;</em> configuration item presence in the bootable JAR Maven plugin in order to add health check probes.\nIf <em>&lt;cloud&gt;</em> item has not been defined, you can still enforce the generation of readiness and liveness probes by setting <em>enforceProbes=true</em>.</p>\n</div>\n<div class=\"paragraph\">\n<p>The enricher will use the following settings by default:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>port = <code>9990</code></p>\n</li>\n<li>\n<p>scheme = <code>HTTP</code></p>\n</li>\n<li>\n<p>readinessPath = <code>/health/ready</code></p>\n</li>\n<li>\n<p>livenessPath = <code>/health/live</code></p>\n</li>\n<li>\n<p>livenessInitialDelay = <code>60</code></p>\n</li>\n<li>\n<p>readinessIntialDelay = <code>10</code></p>\n</li>\n<li>\n<p>failureThreshold = <code>3</code></p>\n</li>\n<li>\n<p>successThreshold = <code>1</code></p>\n</li>\n<li>\n<p>enforceProbes = 'false'</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Setting the <code>port</code> to 0 or to a negative number disables liveness and readiness probes.</p>\n</div>\n<div class=\"paragraph\">\n<p>These values can be configured by the enricher in the <code>openshift-maven-plugin</code> configuration as shown below:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n &lt;executions&gt;\n &lt;execution&gt;\n &lt;id&gt;jkube&lt;/id&gt;\n &lt;goals&gt;\n &lt;goal&gt;resource&lt;/goal&gt;\n &lt;goal&gt;build&lt;/goal&gt;\n &lt;/goals&gt;\n &lt;/execution&gt;\n &lt;/executions&gt;\n &lt;configuration&gt;\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-healthcheck-wildfly-jar&gt;\n &lt;port&gt;4444&lt;/port&gt;\n &lt;scheme&gt;HTTPS&lt;/scheme&gt;\n &lt;livenessPath&gt;/myapp/live&lt;/livenessPath&gt;\n &lt;failureThreshold&gt;3&lt;/failureThreshold&gt;\n &lt;successThreshold&gt;1&lt;/successThreshold&gt;\n &lt;/jkube-healthcheck-wildfly-jar&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_enricher_api\">8.2. Enricher API</h3>\n<div class=\"paragraph\">\n<p><em>How to write your own enrichers and install them.</em></p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"profiles\">9. Profiles</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Profiles can be used to combine a set of enrichers and generators and to give this combination a referable name.</p>\n</div>\n<div class=\"paragraph\">\n<p>Profiles are defined in YAML. The following example shows a simple profiles which uses only the\n<a href=\"#generator-spring-boot\">Spring Boot generator</a> and some enrichers adding for adding default resources:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Profile Definition</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">- name: my-spring-boot-apps <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n generator: <i class=\"conum\" data-value=\"2\"></i><b>(2)</b>\n includes:\n - spring-boot\n enricher: <i class=\"conum\" data-value=\"3\"></i><b>(3)</b>\n includes: <i class=\"conum\" data-value=\"4\"></i><b>(4)</b>\n # Default Deployment object\n - jkube-controller\n # Add a default service\n - jkube-service\n excludes: <i class=\"conum\" data-value=\"5\"></i><b>(5)</b>\n - jkube-icon\n config: <i class=\"conum\" data-value=\"6\"></i><b>(6)</b>\n jkube-service:\n # Expose service as NodePort\n type: NodePort\n order: 10 <i class=\"conum\" data-value=\"7\"></i><b>(7)</b>\n- name: another-profile\n# ....</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Profile&#8217;s name</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"2\"></i><b>2</b></td>\n<td><a href=\"#generators\">Generators</a> to use</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"3\"></i><b>3</b></td>\n<td><a href=\"#enrichers\">Enrichers</a> to use</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"4\"></i><b>4</b></td>\n<td>List of enricher to <strong>include</strong> in that given order</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"5\"></i><b>5</b></td>\n<td>List of enricher to <strong>exclude</strong></td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"6\"></i><b>6</b></td>\n<td>Configuration for services an enrichers</td>\n</tr>\n<tr>\n<td><i class=\"conum\" data-value=\"7\"></i><b>7</b></td>\n<td>An order which influences the way how profiles with the same name are merged</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>Each <code>profiles.yml</code> has a list of profiles which are defined with these elements:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 46. Profile elements</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>name</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Profile name. This plugin comes with a set of <a href=\"#profiles-predefined\">predefined profiles</a>. Those profiles can be\n extended by defining a custom profile with the same name of the profile to extend.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>generator</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of generator definitions. See <a href=\"#generator-enricher-definition\">below</a> for the format of these definitions.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>enricher</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of enrichers definitions. See <a href=\"#generator-enricher-definition\">below</a> for the format of these definitions.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>order</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The order of the profile which is used when profiles of the same name are merged.</p></td>\n</tr>\n</tbody>\n</table>\n<div class=\"sect2\">\n<h3 id=\"generator-enricher-definition\">9.1. Generator and Enricher definitions</h3>\n<div class=\"paragraph\">\n<p>The definition of generators and enrichers in the profile follows the same format:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 47. Generator and Enericher definition</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Element</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>includes</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of generators or enrichers to include. The order in the list determines the order in which the processors are applied.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>excludes</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">List of generators or enrichers. These have precedences over <em>includes</em> and will exclude a processor even when referenced in an <em>includes</em> sections</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>config</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Configuration for generators or enrichers. This is a map where the keys are the name of the processor to configure and the value is again a map with configuration keys and values specific to the processor. See the documentation of the respective generator or enricher for the available configuration keys.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect2\">\n<h3 id=\"profiles-lookup-order\">9.2. Lookup order</h3>\n<div class=\"paragraph\">\n<p>Profiles can be defined externally either directly as a build resource in <code>src/main/jkube/profiles.yml</code> or provided as part of a plugin&#8217;s dependency where it is supposed to be included as <code>META-INF/jkube/profiles.yml</code>. Multiple profiles can be include in these <code>profiles.yml</code> descriptors as a list:</p>\n</div>\n<div class=\"paragraph\">\n<p>If a profile is <a href=\"#profiles-using\">used</a> then it is looked up from various places in the following order:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>From the compile and plugin classpath from <code>META-INF/jkube/profiles-default.yml</code>. These files are reserved for profiles defined by this plugin</p>\n</li>\n<li>\n<p>From the compile and plugin classpath from <code>META-INF/jkube/profiles.yml</code>. Use this location for defining your custom profiles which you want to include via dependencies.</p>\n</li>\n<li>\n<p>From the project in <code>src/main/jkube/profiles.yml</code>. The directory can be tuned with the plugin option <code>resourceDir</code> (property: <code>jkube.resourceDir</code>)</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>When multiple profiles of the same name are found, then these profiles are merged. If profile have an order number, then the <em>higher</em> order takes precedences when merging profiles.</p>\n</div>\n<div class=\"paragraph\">\n<p>For <em>includes</em> of the same processors, the processor is moved to the earliest position. E.g consider the following two profiles with the name <code>my-profile</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Profile A</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">name: my-profile\nenricher:\n includes: [ e1, e2 ]</code></pre>\n</div>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Profile B</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">name: my-profile\nenricher:\n includes: [ e3, e1 ]\norder: 10</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>then when merged results in the following profile (when no order is given, it defaults to 0):</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Profile merged</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">name: my-profile\nenricher:\n includes: [ e1, e2, e3 ]\norder: 10</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Profile with the same order number are merged according to the lookup order described above, where the latter profile is supposed to have a higher order.</p>\n</div>\n<div class=\"paragraph\">\n<p>The configuration for enrichers and generators are merged, too, where higher order profiles override configuration values with the same key of lower order profile configuration.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"profiles-using\">9.3. Using Profiles</h3>\n<div class=\"paragraph\">\n<p>Profiles can be selected by defining them in the plugin configuration, by giving a system property or by using\n<a href=\"#profiles-resource-fragments\">special directories</a> in the directory holding the resource fragments.</p>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Profile used in plugin configuration</div>\n<p>Here is an example how the profile can be used in a plugin configuration:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;configuration&gt;\n &lt;profile&gt;my-spring-boot-apps&lt;/profile&gt; <i class=\"conum\" data-value=\"1\"></i><b>(1)</b>\n &lt;!-- ... --&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"colist arabic\">\n<table>\n<tr>\n<td><i class=\"conum\" data-value=\"1\"></i><b>1</b></td>\n<td>Name which select the profile from the <code>profiles.yml</code></td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<div class=\"title\">Profile as system property</div>\n<p>Alternatively a profile can be also specified on the command line when calling Maven:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn -Djkube.profile=my-spring-boot-apps oc:build oc:deploy</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>If a configuration for enrichers and generators are provided as part of the plugin&#8217;s <code>&lt;configuration&gt;</code> then this takes precedence over any profile specified.</p>\n</div>\n<div id=\"profiles-resource-fragments\" class=\"paragraph\">\n<div class=\"title\">Profiles for resource fragments</div>\n<p>Profiles are also very useful when used together with resource fragments in <code>src/main/jkube</code>. By default the resource objects defined here are enriched with the configured profile (if any). A different profile can be selected easily by using a sub directory within <code>src/main/jkube</code>. The name of each sub directory is interpreted as a profile name and all resource definition files found in this sub directory are enhanced with the enhancers defined in this profile.</p>\n</div>\n<div class=\"paragraph\">\n<p>For example, consider the following directory layout:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>src/main/oc:\n app-rc.yml\n app-svc.yml\n raw/ --&gt;\n couchbase-rc.yml\n couchbase-svc.yml</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Here, the resource descriptors <code>app-rc.yml</code> and <code>app-svc.yml</code> are enhanced with the enrichers defined in the main configuration. The files two files <code>couchbase-rc.yml</code> and <code>couchbase-svc.yml</code> in the sub directory <code>raw/</code> instead are enriched with the profile <strong>raw</strong>. This is a predefined profile which includes no enricher at all, so the couchbase resource objects are not enriched and taken over literally. This is an easy way how you can fine tune enrichment for different object set.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"profiles-predefined\">9.4. Predefined Profiles</h3>\n<div class=\"paragraph\">\n<p>This plugin comes with a list of the following predefined profiles:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 48. Predefined Profiles</caption>\n<colgroup>\n<col style=\"width: 14.2857%;\">\n<col style=\"width: 85.7143%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Profile</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>default</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">The default profile which is active if no profile is specified. It consists of a curated set of generator and enrichers. See <a href=\"#profiles-default\">below</a> for the current definition.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>minimal</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">This profile contains no generators and only enrichers for adding default objects (controller and services). No other enrichment is included.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>explicit</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Like default but without adding default objects like controllers and services.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>aggregate</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Includes no generators and only the <a href=\"#jkube-dependency\">jkube-dependency</a> enricher for picking up and combining resources from the compile time dependencies.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>internal-microservice</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Do not expose a port for the service to generate. Otherwise the same as the <em>default</em> profile.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><strong>osio</strong></p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Includes everything in the <em>default</em> profile, plus additional enrichers and generators relevant only to <a href=\"https://openshift.io\">OpenShift.io</a>.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect2\">\n<h3 id=\"profiles-extended\">9.5. Extending Profiles</h3>\n<div class=\"paragraph\">\n<p>A profile can also extend another profile to avoid repetition e.g of generators if the profile is only about including certain enrichers. For example, for a profile like:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">- name: minimal\n extends: default\n enricher:\n includes:\n - jkube-name\n - jkube-controller\n - jkube-service\n - jkube-image\n - jkube-project-label\n - jkube-debug\n - jkube-namespace\n - jkube-metadata\n - jkube-controller-from-configuration\n - jkube-openshift-deploymentconfig\n - jkube-openshift-project\n - jkube-openshift-service-expose\n - jkube-openshift-route</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>one then would not need to repeat all generators as they are inherited from the <code>default</code> profile.</p>\n</div>\n<div id=\"profiles-default\" class=\"listingblock\">\n<div class=\"title\">Default Profile</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\"># Default profile which is always activated\n- name: default\n enricher:\n # The order given in \"includes\" is the order in which enrichers are called\n includes:\n - jkube-metadata\n - jkube-name\n - jkube-controller\n - jkube-controller-from-configuration\n - jkube-service\n - jkube-namespace\n - jkube-image\n - jkube-portname\n - jkube-project-label\n - jkube-dependency\n - jkube-pod-annotations\n - jkube-git\n - jkube-maven-scm\n - jkube-serviceaccount\n - jkube-maven-issue-mgmt\n # TODO: Documents and verify enrichers below\n - jkube-debug\n - jkube-remove-build-annotations\n - jkube-volume-permission\n - jkube-configmap-file\n - jkube-secret-file\n\n # Route exposure\n - jkube-openshift-service-expose\n - jkube-openshift-route\n - jkube-openshift-deploymentconfig\n - jkube-openshift-project\n\n # Ingress\n - jkube-ingress\n\n # -----------------------------------------\n # TODO: Document and verify enrichers below\n # Health checks\n - jkube-healthcheck-quarkus\n - jkube-healthcheck-spring-boot\n - jkube-healthcheck-wildfly-swarm\n - jkube-healthcheck-thorntail-v2\n - jkube-healthcheck-wildfly-jar\n - jkube-healthcheck-karaf\n - jkube-healthcheck-vertx\n - jkube-healthcheck-docker\n - jkube-healthcheck-webapp\n - jkube-prometheus\n # Dependencies shouldn't be enriched anymore, therefore it's last in the list\n - jkube-dependency\n - jkube-revision-history\n - jkube-docker-registry-secret\n - jkube-triggers-annotation\n - jkube-openshift-imageChangeTrigger\n\n generator:\n # The order given in \"includes\" is the order in which generators are called\n includes:\n - quarkus\n - spring-boot\n - wildfly-swarm\n - thorntail-v2\n - wildfly-jar\n - openliberty\n - karaf\n - vertx\n - java-exec\n - webapp\n watcher:\n includes:\n - spring-boot\n - docker-image</code></pre>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"access-configuration\">10. Access configuration</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_docker_access\">10.1. Docker Access</h3>\n<div class=\"paragraph\">\n<p>For Kubernetes builds the openshift-maven-plugin uses the Docker remote API so the URL of your Docker Daemon must be specified. The URL can be specified by the dockerHost or machine configuration, or by the <code>DOCKER_HOST</code> environment variable. If not given</p>\n</div>\n<div class=\"paragraph\">\n<p>The Docker remote API supports communication via SSL and\nauthentication with certificates. The path to the certificates can\nbe specified by the certPath or machine configuration, or by the\n<code>DOCKER_CERT_PATH</code> environment variable.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_openshift_and_kubernetes_access\">10.2. OpenShift and Kubernetes Access</h3>\n<div class=\"paragraph\">\n<p>Plugin reads your <code>kubeconfig</code> file to read your Kubernetes/OpenShift configuration. By default, <code>kubeconfig</code> file is assumed to be either\nin <code>~/.kube/config</code> or using the environment variable <code>KUBECONFIG</code>.</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"registry\">11. Registry handling</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Docker uses registries to store images. The registry is typically\nspecified as part of the name. I.e. if the first part (everything\nbefore the first <code>/</code>) contains a dot (<code>.</code>) or colon (<code>:</code>) this part is\ninterpreted as an address (with an optionally port) of a remote\nregistry. This registry (or the default <code>docker.io</code> if no\nregistry is given) is used during push and pull operations. This\nplugin follows the same semantics, so if an image name is specified\nwith a registry part, this registry is contacted. Authentication is\nexplained in the next <a href=\"#authentication\">section</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>There are some situations however where you want to have more\nflexibility for specifying a remote registry. This might be because\nyou do not want to hard code a registry into <code>pom.xml</code> but\nprovide it from the outside with an environment variable or a system\nproperty.</p>\n</div>\n<div class=\"paragraph\">\n<p>This plugin supports various ways of specifying a registry:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>If the image name contains a registry part, this registry is used\nunconditionally and can not be overwritten from the outside.</p>\n</li>\n<li>\n<p>If an image name doesn&#8217;t contain a registry, then by default the\ndefault Docker registry <code>docker.io</code> is used for push and pull\noperations. But this can be overwritten through various means:</p>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>If the <code>&lt;image&gt;</code> configuration contains a <code>&lt;registry&gt;</code> subelement\nthis registry is used.</p>\n</li>\n<li>\n<p>Otherwise, a global configuration element <code>&lt;registry&gt;</code> is\nevaluated which can be also provided as system property via\n<code>-Djkube.docker.registry</code>.</p>\n</li>\n<li>\n<p>Finally an environment variable <code>DOCKER_REGISTRY</code> is looked up for\ndetecting a registry.</p>\n</li>\n</ul>\n</div>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>This registry is used for pulling (i.e. for autopull the base image\nwhen doing a <code>oc:build</code>) and pushing with <code>oc:push</code>. However,\nwhen these two goals are combined on the command line like in <code>mvn\n-Djkube.docker.registry=myregistry:5000 package oc:build oc:push</code>\nthe same registry is used for both operation. For a more fine grained\ncontrol, separate registries for <em>pull</em> and <em>push</em> can be specified.</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>In the plugin&#8217;s configuration with the parameters <code>&lt;pullRegistry&gt;</code> and\n<code>&lt;pushRegistry&gt;</code>, respectively.</p>\n</li>\n<li>\n<p>With the system properties <code>jkube.docker.pull.registry</code> and\n<code>jkube.docker.push.registry</code>, respectively.</p>\n</li>\n</ul>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;configuration&gt;\n &lt;registry&gt;docker.jolokia.org:443&lt;/registry&gt;\n &lt;images&gt;\n &lt;image&gt;\n &lt;!-- Without an explicit registry ... --&gt;\n &lt;name&gt;jolokia/jolokia-java&lt;/name&gt;\n &lt;!-- ... hence use this registry --&gt;\n &lt;registry&gt;docker.ro14nd.de&lt;/registry&gt;\n &lt;!-- ... --&gt;\n &lt;/image&gt;\n &lt;image&gt;\n &lt;name&gt;postgresql&lt;/name&gt;\n &lt;!-- No registry in the name, hence use the globally\n configured docker.jolokia.org:443 as registry --&gt;\n &lt;!-- ... --&gt;\n &lt;/image&gt;\n &lt;image&gt;\n &lt;!-- Explicitly specified always wins --&gt;\n &lt;name&gt;docker.example.com:5000/another/server&lt;/name&gt;\n &lt;/image&gt;\n &lt;/images&gt;\n&lt;/configuration&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>There is some special behaviour when using an externally provided\nregistry like described above:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>When <em>pulling</em>, the image pulled will be also tagged with a repository\nname <strong>without</strong> registry. The reasoning behind this is that this\nimage then can be referenced also by the configuration when the\nregistry is not specified anymore explicitly.</p>\n</li>\n<li>\n<p>When <em>pushing</em> a local image, temporarily a tag including the\nregistry is added and removed after the push. This is required\nbecause Docker can only push registry-named images.</p>\n</li>\n</ul>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"authentication\">12. Authentication</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>When pulling (via the <code>autoPull</code> mode of <code>oc:build</code>) or pushing image, it\nmight be necessary to authenticate against a Docker registry.</p>\n</div>\n<div class=\"paragraph\">\n<p>There are five different locations searched for credentials. In order, these are:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Providing system properties <code>jkube.docker.username</code> and <code>jkube.docker.password</code> from the outside.</p>\n</li>\n<li>\n<p>Using a <code>&lt;authConfig&gt;</code> section in the plugin configuration with <code>&lt;username&gt;</code> and <code>&lt;password&gt;</code> elements.</p>\n</li>\n<li>\n<p>Using OpenShift configuration in <code>~/.config/kube</code></p>\n</li>\n<li>\n<p>Using a <code>&lt;server&gt;</code> configuration in <code>~/.m2/settings.xml</code></p>\n</li>\n<li>\n<p>Login into a registry with <code>docker login</code> (credentials in a credential helper or in <code>~/.docker/config.json</code>)</p>\n</li>\n</ul>\n</div>\n<div class=\"paragraph\">\n<p>Using the username and password directly in the <code>pom.xml</code> is not\nrecommended since this is widely visible. This is the easiest and\ntransparent way, though. Using an <code>&lt;authConfig&gt;</code> is straight forward:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;configuration&gt;\n &lt;image&gt;consol/tomcat-7.0&lt;/image&gt;\n &lt;!-- ... --&gt;\n &lt;authConfig&gt;\n &lt;username&gt;jolokia&lt;/username&gt;\n &lt;password&gt;s!cr!t&lt;/password&gt;\n &lt;/authConfig&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The system property provided credentials are a good compromise when\nusing CI servers like Jenkins. You simply provide the credentials from\nthe outside:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sh\" data-lang=\"sh\">mvn -Djkube.docker.username=jolokia -Djkube.docker.password=s!cr!t oc:push</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The most <em>mavenish</em> way is to add a server to the Maven settings file <code>~/.m2/settings.xml</code>:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;servers&gt;\n &lt;server&gt;\n &lt;id&gt;docker.io&lt;/id&gt;\n &lt;username&gt;jolokia&lt;/username&gt;\n &lt;password&gt;s!cr!t&lt;/password&gt;\n &lt;/server&gt;\n &lt;!-- ... --&gt;\n&lt;/servers&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The server id must specify the registry to push to/pull from, which by\ndefault is central index <code>docker.io</code> (or <code>index.docker.io</code> / <code>registry.hub.docker.com</code> as fallbacks).\nHere you should add your docker.io account for your repositories. If you have multiple accounts\nfor the same registry, the second user can be specified as part of the ID. In the example above, if you\nhave a second account 'jkubeio' then use an <code>&lt;id&gt;docker.io/jkubeio&lt;/id&gt;</code> for this second entry. I.e. add the\nusername with a slash to the id name. The default without username is only taken if no server entry with\na username appended id is chosen.</p>\n</div>\n<div class=\"paragraph\">\n<p>The most <em>secure</em> way is to rely on docker&#8217;s credential store or credential helper and read confidential information\nfrom an external credentials store, such as the native keychain of the operating system. Follow the instruction on\n<a href=\"https://docs.docker.com/engine/reference/commandline/login/#credentials-store\">the docker login documentation</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>As a final fallback, this plugin consults <code>$DOCKER_CONFIG/config.json</code> if <code>DOCKER_CONFIG</code> is set, or <code>~/.docker/config.json</code> if not, and reads credentials stored directly within this\nfile. This unsafe behavior happened when connecting to a registry with the command <code>docker login</code> from the command line\nwith older versions of docker (pre 1.13.0) or when docker is not configured to use a\n<a href=\"https://docs.docker.com/engine/reference/commandline/login/#credentials-store\">credential store</a>.</p>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_pull_vs_push_authentication\">12.1. Pull vs. Push Authentication</h3>\n<div class=\"paragraph\">\n<p>The credentials lookup described above is valid for both push and\npull operations. In order to narrow things down, credentials can be\nprovided for pull or push operations alone:</p>\n</div>\n<div class=\"paragraph\">\n<p>In an <code>&lt;authConfig&gt;</code> section a sub-section <code>&lt;pull&gt;</code> and/or <code>&lt;push&gt;</code>\ncan be added. In the example below the credentials provider are only\nused for image push operations:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;configuration&gt;\n &lt;image&gt;consol/tomcat-7.0&lt;/image&gt;\n &lt;!-- ... --&gt;\n &lt;authConfig&gt;\n &lt;push&gt;\n &lt;username&gt;jolokia&lt;/username&gt;\n &lt;password&gt;s!cr!t&lt;/password&gt;\n &lt;/push&gt;\n &lt;/authConfig&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>When the credentials are given on the command line as system\nproperties, then the properties <code>jkube.docker.pull.username</code> /\n<code>jkube.docker.pull.password</code> and <code>jkube.docker.push.username</code> /\n<code>jkube.docker.push.password</code> are used for pull and push operations,\nrespectively (when given). Either way, the standard lookup algorithm\nas described in the previous section is used as fallback.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_openshift_authentication\">12.2. OpenShift Authentication</h3>\n<div class=\"paragraph\">\n<p>When working with the default registry in OpenShift, the credentials\nto authenticate are the OpenShift username and access token. So, a\ntypical interaction with the OpenShift registry from the outside is:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>oc login\n...\nmvn -Djkube.docker.registry=docker-registry.domain.com:80/default/myimage \\\n -Djkube.docker.username=$(oc whoami) \\\n -Djkube.docker.password=$(oc whoami -t)</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>(note, that the image&#8217;s username part (\"default\" here\") must\ncorrespond to an OpenShift project with the same name to which you\ncurrently connected account has access).</p>\n</div>\n<div class=\"paragraph\">\n<p>This can be simplified by using the system property\n<code>docker.useOpenShiftAuth</code> in which case the plugin does the\nlookup. The equivalent to the example above is</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>oc login\n...\nmvn -Ddocker.registry=docker-registry.domain.com:80/default/myimage \\\n -Ddocker.useOpenShiftAuth</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Alternatively the configuration option <code>&lt;useOpenShiftAuth&gt;</code> can be\nadded to the <code>&lt;authConfig&gt;</code> section.</p>\n</div>\n<div class=\"paragraph\">\n<p>For dedicated <em>pull</em> and <em>push</em> configuration the system properties\n<code>jkube.docker.pull.useOpenShiftAuth</code> and <code>jkube.docker.push.useOpenShiftAuth</code> are\navailable as well as the configuration option <code>&lt;useOpenShiftAuth&gt;</code> in\nan <code>&lt;pull&gt;</code> or <code>&lt;push&gt;</code> section within the <code>&lt;authConfig&gt;</code>\nconfiguration.</p>\n</div>\n<div class=\"paragraph\">\n<p>If <code>useOpenShiftAuth</code> is enabled then the OpenShift configuration will be looked up in <code>$KUBECONFIG</code> or, if this environment variable is not set, in <code>~/.kube/config</code>.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"password-encryption\">12.3. Password encryption</h3>\n<div class=\"paragraph\">\n<p>Regardless of which mode you choose you can encrypt password as described\nin the\n<a href=\"http://maven.apache.org/guides/mini/guide-encryption.html\">Maven documentation</a>. Assuming\nthat you have setup a <em>master password</em> in\n<code>~/.m2/security-settings.xml</code> you can create easily encrypt\npasswords:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"title\">Example</div>\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">$ mvn --encrypt-password\nPassword:\n{QJ6wvuEfacMHklqsmrtrn1/ClOLqLm8hB7yUL23KOKo=}</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>This password then can be used in <code>authConfig</code>, <code>docker.password</code>\nand/or the <code>&lt;server&gt;</code> setting configuration. However, putting an\nencrypted password into <code>authConfig</code> in the <code>pom.xml</code> doesn&#8217;t make\nmuch sense, since this password is encrypted with an individual master\npassword.</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"extended-authentication\">12.4. Extended Authentication</h3>\n<div class=\"paragraph\">\n<p>Some docker registries require additional steps to authenticate.\n<a href=\"https://docs.aws.amazon.com/AmazonECR/latest/userguide/ECR_GetStarted.html\">Amazon ECR</a> requires using an IAM access key to obtain temporary docker login credentials.\nThe <a href=\"#jkube:push\"><strong>oc:push</strong></a> and <a href=\"#jkube:build\"><strong>oc:build</strong></a> goals automatically execute this exchange for any registry of the form\n<em>&lt;awsAccountId&gt;</em> <strong>.dkr.ecr.</strong> <em>&lt;awsRegion&gt;</em> <strong>.amazonaws.com</strong>, unless the <code>skipExtendedAuth</code> configuration\n(<code>jkube.docker.skip.extendedAuth</code> property) is set true.</p>\n</div>\n<div class=\"paragraph\">\n<p>Note that for an ECR repository with URI <code>123456789012.dkr.ecr.eu-west-1.amazonaws.com/example/image</code> the d-m-p&#8217;s <code>jkube.docker.registry</code> should be set to <code>123456789012.dkr.ecr.eu-west-1.amazonaws.com</code> and <code>example/image</code> is the <code>&lt;name&gt;</code> of the image.</p>\n</div>\n<div class=\"paragraph\">\n<p>You can use any IAM access key with the necessary permissions in any of the locations mentioned above except <code>~/.docker/config.json</code>.\nUse the IAM <strong>Access key ID</strong> as the username and the <strong>Secret access key</strong> as the password.\nIn case you&#8217;re using temporary security credentials provided by the AWS Security Token Service (AWS STS), you have to provide the <strong>security token</strong> as well.\nTo do so, either specify the <code>docker.authToken</code> system property or provide an <code>&lt;auth&gt;</code> element alongside username &amp; password in the <code>authConfig</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>In case you are running on an EC2 instance that has an appropriate IAM role assigned\n(e.g. a role that grants the AWS built-in policy <em>AmazonEC2ContainerRegistryPowerUser</em>)\nauthentication information doesn&#8217;t need to be provided at all. Instead the instance\nmeta-data service is queried for temporary access credentials supplied by the\nassigned role.</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"volume-configuration\">13. Volume Configuration</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>openshift-maven-plugin supports volume configuration in XML format in pom.xml. These are the volume types which are supported:</p>\n</div>\n<table class=\"tableblock frame-all grid-all stretch\">\n<caption class=\"title\">Table 49. Supported Volume Types</caption>\n<colgroup>\n<col style=\"width: 4.3478%;\">\n<col style=\"width: 95.6522%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Volume Type</th>\n<th class=\"tableblock halign-left valign-top\">Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">hostPath</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mounts a file or directory from the host node&#8217;s filesystem into your pod</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">emptyDir</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Containers in the Pod can all read and write the same files in the emptyDir volume, though that volume can be mounted at the same or different paths in each Container. When a Pod is removed from a node for any reason, the data in the emptyDir is deleted forever.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">gitRepo</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">It mounts an empty directory and clones a git repository into it for your Pod to use.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">secret</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">It is used to pass sensitive information, such as passwords, to Pods.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">nfsPath</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows an existing NFS(Network File System) share to be mounted into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">gcePdName</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mounts a Google Compute Engine(GCE) into your Pod. You must create PD using <code>gcloud</code> or GCE API or UI before you can use it.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">glusterFsPath</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows a Glusterfs (an open source networked filesystem) volume to be mounted into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">persistentVolumeClaim</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Used to mount a PersistentVolume into a Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">awsElasticBlockStore</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mounts an Amazon Web Services(AWS) EBS Volume into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">azureDisk</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mounts a Microsoft Azure Data Disk into a Pod</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">azureFile</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Mounts a Microsoft Azure File Volume(SMB 2.1 and 3.0 into a Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">cephfs</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows an existing CephFS volume to be mounted into your Pod. You must have your own Ceph server running with the share exported before you can use it.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">fc</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows existing fibre channel volume to be mounted in a Pod. You must configure FC SAN Zoning to allocate and mask those LUNs (volumes) to the target WWNs beforehand so that Kubernetes hosts can access them.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">flocker</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Flocker is an open source clustered Container data volume manager. A <code>flocker</code> volume allows a Flocker dataset to be mounted into a Pod. You must have your own Flocker installation running before you can use it.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">iscsi</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows an existing ISCSI(SCSI over IP) volume to be mounted into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">portworxVolume</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A portworxVolume is an elastic block storage layer that runs hyperconverged with Kubernetes.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">quobyte</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows existing <code>Quobyte</code> volume to be mounted into your Pod. You must have your own Quobyte setup running the volumes created.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">rbd</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Allows a Rados Block Device volume to be mounted into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">scaleIO</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ScaleIO is a software-based storage platform that can use existing hardware to create clusters of scalable shared block networked storage. The scaleIO volume plugin allows deployed Pods to access existing ScaleIO volumes.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">storageOS</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A storageos volume allows an existing StorageOS volume to be mounted into your Pod. You must run the StorageOS container on each node that wants to access StorageOS volumes</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">vsphereVolume</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Used to mount a vSphere VMDK volume into your Pod.</p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">downwardAPI</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">A downwardAPI volume is used to make downward API data available to applications. It mounts a directory and writes the requested data in plain text files.</p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"integrations\">14. Integrations</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"integrations.dekorate\">14.1. Dekorate</h3>\n<div class=\"paragraph\">\n<p><strong>openshift-maven-plugin</strong> provides a Zero Configuration approach to delegate deployment manifests\ngeneration to <a href=\"https://github.com/dekorateio/dekorate\">Dekorate</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Just by adding a dependency to Dekorate library in the <code>pom.xml</code> file, all manifest\ngeneration will be delegated to Dekorate.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\"> &lt;dependencies&gt;\n &lt;!-- ... --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.dekorate&lt;/groupId&gt;\n &lt;artifactId&gt;option-annotations&lt;/artifactId&gt;\n &lt;version&gt;${dekorate.version}&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.dekorate&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-annotations&lt;/artifactId&gt;\n &lt;version&gt;${dekorate.version}&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.dekorate&lt;/groupId&gt;\n &lt;artifactId&gt;kubernetes-annotations&lt;/artifactId&gt;\n &lt;version&gt;${dekorate.version}&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.dekorate&lt;/groupId&gt;\n &lt;artifactId&gt;dekorate-spring-boot&lt;/artifactId&gt;\n &lt;version&gt;${dekorate.version}&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;/dependencies&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>A full example of the integration can be found in the directory\n<a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/spring-boot-dekorate\">quickstarts/maven/spring-boot-dekorate</a>.</p>\n</div>\n<div class=\"paragraph\">\n<p>An <strong>experimental</strong> feature is also provided to merge resources generated both by <strong>openshift-maven-plugin</strong>\nand Dekorate. You can activate this feature by using the following flag <code>-Djkube.mergeWithDekorate</code>\nin the command-line, or setting it up as a property (<code>&lt;jkube.mergeWithDekorate&gt;true&lt;/jkube.mergeWithDekorate&gt;</code>).</p>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_jib_java_image_builder\">14.2. JIB (Java Image Builder)</h3>\n<div class=\"paragraph\">\n<p><strong>openshift-maven-plugin</strong> also provides user an option to build container images without having access to any docker daemon.\nYou just need to set <code>jkube.build.strategy</code> property to <code>jib</code>. It will delegate the build process to\n<a href=\"https://github.com/GoogleContainerTools/jib\">JIB</a>. It creates a tarball inside your target directory which can be loaded\ninto any docker daemon afterwards. You may also push the image to your specified registry using push goal with feature flag enabled.</p>\n</div>\n<div class=\"paragraph\">\n<p>You can find more details at <a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/spring-boot-with-jib\">Spring Boot JIB Quickstart</a>.</p>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"faq\">15. FAQ</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_general_questions\">15.1. General questions</h3>\n<div class=\"sect3\">\n<h4 id=\"_how_do_i_define_an_environment_variable\">15.1.1. How do I define an environment variable?</h4>\n<div class=\"paragraph\">\n<p>The easiest way is to add a <code>src/main/jkube/deployment.yml</code> file to your project containing something like:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n template:\n spec:\n containers:\n -env:\n - name: FOO\n value: bar</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The above will generate an environment variable <code>$FOO</code> of value <code>bar</code></p>\n</div>\n<div class=\"paragraph\">\n<p>For a full list of the environments used in java base images, <a href=\"https://hub.docker.com/r/jkube.java-jboss-openjdk8-jdk\">see this list</a></p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_how_do_i_define_a_system_property\">15.1.2. How do I define a system property?</h4>\n<div class=\"paragraph\">\n<p>The simplest way is to add system properties to the <code>JAVA_OPTIONS</code> environment variable.</p>\n</div>\n<div class=\"paragraph\">\n<p>For a full list of the environments used in java base images, <a href=\"https://hub.docker.com/r/jkube.java-jboss-openjdk8-jdk\">see this list</a></p>\n</div>\n<div class=\"paragraph\">\n<p>e.g. add a <code>src/main/jkube/deployment.yml</code> file to your project containing something like:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n template:\n spec:\n containers:\n - env:\n - name: JAVA_OPTIONS\n value: \"-Dfoo=bar -Dxyz=abc\"</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>The above will define the system properties <code>foo=bar</code> and <code>xyz=abc</code></p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_how_do_i_mount_a_config_file_from_a_configmap\">15.1.3. How do I mount a config file from a ConfigMap?</h4>\n<div class=\"paragraph\">\n<p>First you need to create your <code>ConfigMap</code> resource via a file <code>src/main/jkube/configmap.yml</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">data:\n application.properties: |\n # spring application properties file\n welcome = Hello from Kubernetes ConfigMap!!!\n dummy = some value</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then mount the entry in the <code>ConfigMap</code> into your <code>Deployment</code> via a file <code>src/main/jkube/deployment.yml</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">metadata:\n annotations:\n configmap.jkube.io/update-on-change: ${project.artifactId}\nspec:\n replicas: 1\n template:\n spec:\n volumes:\n - name: config\n configMap:\n name: ${project.artifactId}\n items:\n - key: application.properties\n path: application.properties\n containers:\n - volumeMounts:\n - name: config\n mountPath: /deployments/config</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Here is <a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/external-resources\">an example quickstart doing this</a></p>\n</div>\n<div class=\"paragraph\">\n<p>Note that the annotation <code>configmap.jkube.io/update-on-change</code> is optional; its used if your application is not capable\nof watching for changes in the <code>/deployments/config/application.properties</code> file. In this case if you are also running\nthe <a href=\"https://github.com/fabric8io/configmapcontroller\">configmapcontroller</a> then this will cause a rolling upgrade of your\napplication to use the new <code>ConfigMap</code> contents as you change it.</p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_how_do_i_use_a_persistent_volume\">15.1.4. How do I use a Persistent Volume?</h4>\n<div class=\"paragraph\">\n<p>First you need to create your <code>PersistentVolumeClaim</code> resource via a file <code>src/main/jkube/foo-pvc.yml</code> where <code>foo</code> is the name of the <code>PersistentVolumeClaim</code>. It might be your app requires multiple vpersistent volumes so you will need multiple <code>PersistentVolumeClaim</code> resources.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 100Mi</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Then to mount the <code>PersistentVolumeClaim</code> into your <code>Deployment</code> create a file <code>src/main/jkube/deployment.yml</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-yaml\" data-lang=\"yaml\">spec:\n template:\n spec:\n volumes:\n - name: foo\n persistentVolumeClaim:\n claimName: foo\n containers:\n - volumeMounts:\n - mountPath: /whatnot\n name: foo</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Where the above defines the <code>PersistentVolumeClaim</code> called <code>foo</code> which is then mounted into the container at <code>/whatnot</code></p>\n</div>\n</div>\n<div class=\"sect3\">\n<h4 id=\"_how_do_i_generate_ingress_for_my_generated_service\">15.1.5. How do I generate Ingress for my generated Service?</h4>\n<div class=\"paragraph\">\n<p><code>Ingress</code> generation is supported by Eclipse JKube for <code>Service</code> objects of type <code>LoadBalancer</code>. In order to generate <code>Ingress</code> you need to enable <code>jkube.createExternalUrls</code> property to <code>true</code> and <code>jkube.domain</code> property to desired host suffix, it would be appended to your service name for host value. You can also also provide a host for it in XML config like this:</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;version&gt;1.0.0&lt;/version&gt;\n\n &lt;configuration&gt;\n &lt;resources&gt;\n &lt;routeDomain&gt;org.eclipse.jkube&lt;/routeDomain&gt;\n &lt;/resources&gt;\n\n &lt;enricher&gt;\n &lt;config&gt;\n &lt;jkube-service&gt;\n &lt;type&gt;LoadBalancer&lt;/type&gt;\n &lt;/jkube-service&gt;\n &lt;/config&gt;\n &lt;/enricher&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>You can find an example in our <a href=\"https://github.com/eclipse/jkube/tree/master/quickstarts/maven/spring-boot\">spring-boot</a> quickstart in <code>kubernetes-with-ingress</code> profile.</p>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"appendix\">16. Appendix</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_kindfilename_type_mapping\">16.1. Kind/Filename Type Mapping</h3>\n<table id=\"appendix-kind-mapping\" class=\"tableblock frame-all grid-all stretch\">\n<colgroup>\n<col style=\"width: 50%;\">\n<col style=\"width: 50%;\">\n</colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Kind</th>\n<th class=\"tableblock halign-left valign-top\">Filename Type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">BuildConfig</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>bc</code>, <code>buildconfig</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ClusterRole</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>cr</code>, <code>crole</code>, <code>clusterrole</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ConfigMap</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>cm</code>, <code>configmap</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ClusterRoleBinding</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>crb</code>, <code>clusterrb</code>, <code>clusterrolebinding</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">CronJob</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>cj</code>, <code>cronjob</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">CustomResourceDefinition</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>crd</code>, <code>customerresourcedefinition</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">DaemonSet</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>ds</code>, <code>daemonset</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Deployment</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>deployment</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">DeploymentConfig</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>dc</code>, <code>deploymentconfig</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ImageStream</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>is</code>, <code>imagestream</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ImageStreamTag</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>istag</code>, <code>imagestreamtag</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Ingress</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>ingress</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Job</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>job</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">LimitRange</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>lr</code>, <code>limitrange</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Namespace</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>ns</code>, <code>namespace</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">OAuthClient</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>oauthclient</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">PolicyBinding</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>pb</code>, <code>policybinding</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">PersistentVolume</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>pv</code>, <code>persistentvolume</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">PersistentVolumeClaim</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>pvc</code>, <code>persistemtvolumeclaim</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Project</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>project</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ProjectRequest</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>pr</code>, <code>projectrequest</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ReplicaSet</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>rs</code>, <code>replicaset</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ReplicationController</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>rc</code>, <code>replicationcontroller</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ResourceQuota</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>rq</code>, <code>resourcequota</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Role</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>role</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">RoleBinding</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>rb</code>, <code>rolebinding</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">RoleBindingRestriction</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>rbr</code>, <code>rolebindingrestriction</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Route</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>route</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Secret</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>secret</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Service</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>svc</code>, <code>service</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">ServiceAccount</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>sa</code>, <code>serviceaccount</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">StatefulSet</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>statefulset</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Template</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>template</code></p></td>\n</tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\">Pod</p></td>\n<td class=\"tableblock halign-left valign-top\"><p class=\"tableblock\"><code>pd</code>, <code>pod</code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_custom_kindfilename_mapping\">16.2. Custom Kind/Filename Mapping</h3>\n<div class=\"paragraph\">\n<p>You can add your custom <code>Kind/Filename</code> mappings.\nTo do it you have two approaches:</p>\n</div>\n<div class=\"ulist\">\n<ul>\n<li>\n<p>Setting an environment variable or system property called <code>jkube.mapping</code> pointing out to a <code>.properties</code> files with pairs <code>&lt;kind&gt;&#8658;filename1&gt;, &lt;filename2&gt;</code>\nBy default if no environment variable nor system property is set, scan for a file located at classpath <code>/META-INF/jkube.kind-filename-type-mapping-default.properties</code>.</p>\n</li>\n<li>\n<p>By embedding in MOJO configuration the mapping:</p>\n</li>\n</ul>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-xml\" data-lang=\"xml\">&lt;plugin&gt;\n &lt;groupId&gt;org.eclipse.jkube&lt;/groupId&gt;\n &lt;artifactId&gt;openshift-maven-plugin&lt;/artifactId&gt;\n &lt;configuration&gt;\n &lt;mappings&gt;\n &lt;mapping&gt;\n &lt;kind&gt;Var&lt;/kind&gt;\n &lt;filenameTypes&gt;foo, bar&lt;/filenameTypes&gt;\n &lt;/mapping&gt;\n &lt;/mappings&gt;\n &lt;/configuration&gt;\n&lt;/plugin&gt;</code></pre>\n</div>\n</div>\n</div>\n</div>\n</div>","document":{"title":"org.eclipse.jkube/openshift-maven-plugin","subtitle":""}}},"pageContext":{"id":"c6e0e68d-58c2-50f9-a0f5-8c4e1ba2b485","langKey":"en"}},"staticQueryHashes":[]}