diff --git a/manual/src/main/asciidoc/developer-guide/karaf-maven-plugin.adoc b/manual/src/main/asciidoc/developer-guide/karaf-maven-plugin.adoc index 47090ee60a7..5b62598185a 100644 --- a/manual/src/main/asciidoc/developer-guide/karaf-maven-plugin.adoc +++ b/manual/src/main/asciidoc/developer-guide/karaf-maven-plugin.adoc @@ -991,6 +991,14 @@ The `karaf:dockerfile` goal creates a ready to use Dockerfile for a given Karaf |`assembly` |`File` |The directory containing the Karaf assembly (as generated by `karaf:assembly`). Default value: ${project.build.directory}/assembly + +|`command` +|`String` +|The CMD command instruction to include in the generated Dockerfile. Default value: `["karaf", "run"]` + +|`image` +|`String` +|The base Docker image (FROM instruction) to use. Default value: `eclipse-temurin:11-jre` |=== ===== Docker @@ -1008,7 +1016,7 @@ This goal requires a local Docker daemon and runs only on Unix. The `docker` com docker - docker + docker ---- diff --git a/tooling/karaf-maven-plugin/src/it/test-dockerfile/verify.bsh b/tooling/karaf-maven-plugin/src/it/test-dockerfile/verify.bsh index f42d4205c9b..e96f6587028 100644 --- a/tooling/karaf-maven-plugin/src/it/test-dockerfile/verify.bsh +++ b/tooling/karaf-maven-plugin/src/it/test-dockerfile/verify.bsh @@ -22,4 +22,10 @@ import java.lang.*; import java.util.*; File generated = new File(basedir, "target/Dockerfile"); -return generated.exists(); \ No newline at end of file +if (!generated.exists()) { + return false; +} +BufferedReader reader = new BufferedReader(new FileReader(generated)); +String line = reader.readLine(); +reader.close(); +return line != null && line.startsWith("FROM eclipse-temurin:11-jre"); \ No newline at end of file diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/DockerfileMojo.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/DockerfileMojo.java index 83fa290cb75..dee90777186 100644 --- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/DockerfileMojo.java +++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/DockerfileMojo.java @@ -40,13 +40,16 @@ public class DockerfileMojo extends MojoSupport { @Parameter(defaultValue = "[\"karaf\", \"run\"]") private String command; + @Parameter(defaultValue = "eclipse-temurin:11-jre", property = "image") + private String image; + @Override public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Creating Dockerfile"); File dockerFile = new File(destDir, "Dockerfile"); try { StringBuilder buffer = new StringBuilder(); - buffer.append("FROM eclipse-temurin:11-jre").append("\n"); + buffer.append("FROM ").append(image).append("\n"); buffer.append("ENV KARAF_INSTALL_PATH /opt").append("\n"); buffer.append("ENV KARAF_HOME $KARAF_INSTALL_PATH/apache-karaf").append("\n"); buffer.append("ENV KARAF_EXEC exec").append("\n"); diff --git a/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/DockerfileMojoTest.java b/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/DockerfileMojoTest.java new file mode 100644 index 00000000000..c23618a9a5e --- /dev/null +++ b/tooling/karaf-maven-plugin/src/test/java/org/apache/karaf/tooling/DockerfileMojoTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.karaf.tooling; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class DockerfileMojoTest { + + @Rule + public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Test + public void testDefaultDockerfileGeneration() throws Exception { + DockerfileMojo mojo = new DockerfileMojo(); + File destDir = temporaryFolder.newFolder("target"); + File assembly = new File(destDir, "assembly"); + + setPrivateField(mojo, "destDir", destDir); + setPrivateField(mojo, "assembly", assembly); + setPrivateField(mojo, "command", "[\"karaf\", \"run\"]"); + setPrivateField(mojo, "image", "eclipse-temurin:11-jre"); + + mojo.execute(); + + File dockerfile = new File(destDir, "Dockerfile"); + assertTrue("Dockerfile should be created", dockerfile.exists()); + + List lines = Files.readAllLines(dockerfile.toPath()); + assertEquals("FROM eclipse-temurin:11-jre", lines.get(0)); + assertEquals("ENV KARAF_INSTALL_PATH /opt", lines.get(1)); + assertEquals("ENV KARAF_HOME $KARAF_INSTALL_PATH/apache-karaf", lines.get(2)); + assertEquals("ENV KARAF_EXEC exec", lines.get(3)); + assertEquals("ENV PATH $PATH:$KARAF_HOME/bin", lines.get(4)); + assertEquals("COPY assembly $KARAF_HOME", lines.get(5)); + assertEquals("EXPOSE 8101 1099 44444 8181", lines.get(6)); + assertEquals("CMD [\"karaf\", \"run\"]", lines.get(7)); + } + + @Test + public void testCustomImageAndCommand() throws Exception { + DockerfileMojo mojo = new DockerfileMojo(); + File destDir = temporaryFolder.newFolder("target-custom"); + File assembly = new File(destDir, "custom-dist"); + + setPrivateField(mojo, "destDir", destDir); + setPrivateField(mojo, "assembly", assembly); + setPrivateField(mojo, "command", "[\"karaf\", \"server\"]"); + setPrivateField(mojo, "image", "eclipse-temurin:17-jre"); + + mojo.execute(); + + File dockerfile = new File(destDir, "Dockerfile"); + assertTrue("Dockerfile should be created", dockerfile.exists()); + + List lines = Files.readAllLines(dockerfile.toPath()); + assertEquals("FROM eclipse-temurin:17-jre", lines.get(0)); + assertEquals("COPY custom-dist $KARAF_HOME", lines.get(5)); + assertEquals("CMD [\"karaf\", \"server\"]", lines.get(7)); + } + + private void setPrivateField(Object obj, String fieldName, Object value) throws Exception { + Class aClass = obj.getClass(); + while (aClass != null) { + try { + Field field = aClass.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(obj, value); + return; + } catch (final NoSuchFieldException nsfe) { + aClass = aClass.getSuperclass(); + } + } + fail("cant set " + fieldName); + } +}