Skip to content

Commit 4c03397

Browse files
christophddavsclaus
authored andcommitted
CAMEL-21716: Improve JBang Kubernetes plugin container image options
- Set basic settings on JIB image builder - Introduce configurable base image (default is still eclipse-temurin:17) - Set image platforms on JKube properties - Set proper image push registry on JKube properties
1 parent 3d45d9f commit 4c03397

File tree

7 files changed

+101
-12
lines changed

7 files changed

+101
-12
lines changed

Diff for: docs/user-manual/modules/ROOT/pages/camel-jbang-kubernetes.adoc

+9
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,15 @@ The Camel JBang Kubernetes export command provides several options to customize
160160
|--image-builder
161161
|The image builder used to build the container image (e.g. docker, jib, podman, s2i).
162162

163+
|--image-platform
164+
|List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64).
165+
166+
|--base-image
167+
|The base image that is used to build the container image from (default is eclipse-temurin:<java-version>).
168+
169+
|--registry-mirror
170+
|Optional Docker registry mirror where to pull images from when building the container image.
171+
163172
|--cluster-type
164173
|The target cluster type. Special configurations may be applied to different cluster types such as Kind or Minikube.
165174

Diff for: dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/main-kubernetes-pom.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
<images>
133133
<image>
134134
<build>
135-
<from>eclipse-temurin:{{ .JavaVersion }}</from>
135+
<from>${jkube.base.image}</from>
136136
<entryPoint>
137137
<exec>
138138
<arg>java</arg>

Diff for: dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/quarkus-kubernetes-pom.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
<images>
9898
<image>
9999
<build>
100-
<from>eclipse-temurin:{{ .JavaVersion }}</from>
100+
<from>${jkube.base.image}</from>
101101
<assembly>
102102
<layers>
103103
<layer>

Diff for: dsl/camel-jbang/camel-jbang-core/src/main/resources/templates/spring-boot-kubernetes-pom.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@
8383
<images>
8484
<image>
8585
<build>
86-
<from>eclipse-temurin:{{ .JavaVersion }}</from>
86+
<from>${jkube.base.image}</from>
8787
<entryPoint>
8888
<exec>
8989
<arg>java</arg>

Diff for: dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java

+42-5
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,24 @@ public class KubernetesExport extends Export {
102102

103103
@CommandLine.Option(names = { "--image-builder" }, defaultValue = "jib",
104104
description = "The image builder used to build the container image (e.g. docker, jib, podman).")
105-
protected String imageBuilder;
105+
protected String imageBuilder = "jib";
106106

107107
@CommandLine.Option(names = { "--image-push" }, defaultValue = "true",
108108
description = "Whether to push the container image to a given image registry.")
109109
protected boolean imagePush = true;
110110

111+
@CommandLine.Option(names = { "--image-platform" },
112+
description = "List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64).")
113+
protected String[] imagePlatforms;
114+
115+
@CommandLine.Option(names = { "--base-image" },
116+
description = "The base image that is used to build the container image from (default is eclipse-temurin:<java-version>).")
117+
protected String baseImage;
118+
119+
@CommandLine.Option(names = { "--registry-mirror" },
120+
description = "Optional Docker registry mirror where to pull images from when building the container image.")
121+
protected String registryMirror;
122+
111123
@CommandLine.Option(names = { "--cluster-type" },
112124
description = "The target cluster type. Special configurations may be applied to different cluster types such as Kind or Minikube or Openshift.")
113125
protected String clusterType;
@@ -182,9 +194,15 @@ public Integer export() throws Exception {
182194

183195
if (resolvedImageRegistry != null) {
184196
buildProperties.add("jkube.container-image.registry=%s".formatted(resolvedImageRegistry));
197+
if (imagePush) {
198+
buildProperties.add("jkube.docker.push.registry=%s".formatted(resolvedImageRegistry));
199+
}
200+
185201
// [TODO] jkube config for insecure registries?
186-
// var allowInsecure = resolvedImageRegistry.startsWith("localhost");
187-
// buildProperties.add("%s.container-image.insecure=%b".formatted(propPrefix, allowInsecure));
202+
var allowInsecure = resolvedImageRegistry.startsWith("localhost");
203+
if (allowInsecure && "jib".equals(imageBuilder)) {
204+
buildProperties.add("jib.allowInsecureRegistries=true");
205+
}
188206
}
189207

190208
String projectName = getProjectName();
@@ -255,6 +273,7 @@ public Integer export() throws Exception {
255273

256274
Container container = traitsSpec.getContainer();
257275

276+
buildProperties.add("jkube.image.name=%s".formatted(container.getImage()));
258277
buildProperties.add("jkube.container-image.name=%s".formatted(container.getImage()));
259278

260279
if (container.getName() != null && !container.getName().equals(projectName)) {
@@ -278,8 +297,26 @@ public Integer export() throws Exception {
278297
buildProperties.add("jkube.maven.plugin=%s".formatted("kubernetes-maven-plugin"));
279298
}
280299

281-
if ("docker".equals(imageBuilder) || "jib".equals(imageBuilder)) {
282-
buildProperties.add("jkube.build.strategy=%s".formatted(imageBuilder));
300+
if (baseImage == null) {
301+
// use default base image with java version
302+
baseImage = "eclipse-temurin:%s".formatted(javaVersion);
303+
}
304+
305+
if (registryMirror != null) {
306+
baseImage = "%s/%s".formatted(registryMirror, baseImage);
307+
}
308+
309+
buildProperties.add("jkube.base.image=%s".formatted(baseImage));
310+
buildProperties.add("jkube.build.strategy=%s".formatted(imageBuilder));
311+
312+
if ("jib".equals(imageBuilder)) {
313+
buildProperties.add("jkube.container-image.nocache=true");
314+
buildProperties.add("jib.disableUpdateChecks=true");
315+
}
316+
317+
if (imagePlatforms != null) {
318+
buildProperties.add("jkube.container-image.platforms=%s".formatted(
319+
Arrays.stream(imagePlatforms).distinct().collect(Collectors.joining(","))));
283320
}
284321

285322
// Runtime specific for Main

Diff for: dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesRun.java

+15-4
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public class KubernetesRun extends KubernetesBaseCommand {
144144

145145
@CommandLine.Option(names = { "--image-builder" }, defaultValue = "jib",
146146
description = "The image builder used to build the container image (e.g. docker, jib, podman).")
147-
String imageBuilder;
147+
String imageBuilder = "jib";
148148

149149
@CommandLine.Option(names = { "--cluster-type" },
150150
description = "The target cluster type. Special configurations may be applied to different cluster types such as Kind or Minikube.")
@@ -158,9 +158,17 @@ public class KubernetesRun extends KubernetesBaseCommand {
158158
description = "Whether to push image to given image registry as part of the run.")
159159
boolean imagePush = true;
160160

161-
@CommandLine.Option(names = { "--image-platforms" },
162-
description = "List of target platforms. Each platform is defined using the pattern.")
163-
String imagePlatforms;
161+
@CommandLine.Option(names = { "--image-platform" },
162+
description = "List of target platforms. Each platform is defined using os and architecture (e.g. linux/amd64).")
163+
String[] imagePlatforms;
164+
165+
@CommandLine.Option(names = { "--base-image" },
166+
description = "The base image that is used to build the container image from (default is eclipse-temurin:<java-version>).")
167+
String baseImage;
168+
169+
@CommandLine.Option(names = { "--registry-mirror" },
170+
description = "Optional Docker registry mirror where to pull images from when building the container image.")
171+
String registryMirror;
164172

165173
// Export base options
166174

@@ -386,6 +394,9 @@ private KubernetesExport configureExport(String workingDir) {
386394
export.imageGroup = imageGroup;
387395
export.imagePush = imagePush;
388396
export.imageBuilder = imageBuilder;
397+
export.imagePlatforms = imagePlatforms;
398+
export.baseImage = baseImage;
399+
export.registryMirror = registryMirror;
389400
export.clusterType = clusterType;
390401
export.serviceAccount = serviceAccount;
391402
export.setApplicationProperties(properties);

Diff for: dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java

+32
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public void shouldGenerateProject(RuntimeType rt) throws Exception {
6161
Assertions.assertEquals("examples", model.getGroupId());
6262
Assertions.assertEquals("route", model.getArtifactId());
6363
Assertions.assertEquals("1.0.0", model.getVersion());
64+
65+
Properties props = model.getProperties();
66+
Assertions.assertEquals("examples/route:1.0.0", props.get("jkube.image.name"));
67+
Assertions.assertEquals("eclipse-temurin:17", props.get("jkube.base.image"));
68+
Assertions.assertEquals("jib", props.get("jkube.build.strategy"));
69+
Assertions.assertNull(props.get("jkube.docker.push.registry"));
70+
Assertions.assertNull(props.get("jkube.container-image.registry"));
71+
Assertions.assertNull(props.get("jkube.container-image.platforms"));
6472
}
6573

6674
@ParameterizedTest
@@ -77,6 +85,30 @@ public void shouldGenerateNamedProject(RuntimeType rt) throws Exception {
7785
Assertions.assertEquals("1.0-SNAPSHOT", model.getVersion());
7886
}
7987

88+
@ParameterizedTest
89+
@MethodSource("runtimeProvider")
90+
public void shouldConfigureContainerImage(RuntimeType rt) throws Exception {
91+
KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" },
92+
"--image-registry=quay.io", "--image-group=camel-riders", "--base-image=my-base-image:latest",
93+
"--registry-mirror=mirror.gcr.io", "--image-builder=docker",
94+
"--image-platform=linux/amd64", "--image-platform=linux/arm64", "--runtime=" + rt.runtime());
95+
int exit = command.doCall();
96+
Assertions.assertEquals(0, exit);
97+
98+
Model model = readMavenModel();
99+
Assertions.assertEquals("org.example.project", model.getGroupId());
100+
Assertions.assertEquals("route", model.getArtifactId());
101+
Assertions.assertEquals("1.0-SNAPSHOT", model.getVersion());
102+
103+
Properties props = model.getProperties();
104+
Assertions.assertEquals("quay.io/camel-riders/route:1.0-SNAPSHOT", props.get("jkube.image.name"));
105+
Assertions.assertEquals("mirror.gcr.io/my-base-image:latest", props.get("jkube.base.image"));
106+
Assertions.assertEquals("docker", props.get("jkube.build.strategy"));
107+
Assertions.assertEquals("quay.io", props.get("jkube.docker.push.registry"));
108+
Assertions.assertEquals("quay.io", props.get("jkube.container-image.registry"));
109+
Assertions.assertEquals("linux/amd64,linux/arm64", props.get("jkube.container-image.platforms"));
110+
}
111+
80112
@ParameterizedTest
81113
@MethodSource("runtimeProvider")
82114
public void shouldGenerateKubernetesManifest(RuntimeType rt) throws Exception {

0 commit comments

Comments
 (0)