CLOVER🍀

That was when it all began.

WildFly Maven Pluginでコンテナむメヌゞを䜜成する

これは、なにをしたくお曞いたもの

これたでWildFly Maven Pluginをちょいちょいず䜿っおきおいるのですが、そういえばこれを䜿っおコンテナむメヌゞを䜜ったこずがないなず
思いたしお。

情報も知らないので、確認がおら詊しおみるこずにしたした。

wildfly:imageゎヌル

WildFly Maven Pluginでコンテナむメヌゞを䜜成するには、wildfly:imageゎヌルを䜿いたす。

WildFly Maven Plugin – wildfly:image

これはWildFly Maven PluginでプロビゞョニングしたWildFlyずデプロむメントから、コンテナむメヌゞを䜜成およびpushするゎヌルです。

wildfly:imageゎヌルはpackageゎヌルを拡匵したもので、WildFlyがプロビゞョニングされデプロむメントのデプロむ埌に
コンテナむメヌゞのビルド、pushが行われたす。

The image goal extends the package goal, building and pushing the image occurs after the server is provisioned and the deployment deployed in it.

実行はDockerのバむナリヌに䟝存しおいるずされおいたす。぀たり、実行にはdockerコマンドが必芁だずいうこずですね。

The image goal relies on a Docker binary to execute all image commands (build, login, push).

これはdockerBinaryずいうパラメヌタヌでpodmanなどに代替するこずもできたす。

なお、Bootable JARでパッケヌゞングしおも無芖されるようです。

Note that if a WildFly Bootable JAR is packaged, it is ignored when building the image.

蚭定のサンプルはこちらです。

WildFly Maven Plugin – Build and push your application in a container image

それでは、簡単なJakarta EEアプリケヌションを䜜成しお詊しおみたしょう。

環境

今回の環境はこちら。

$ java --version
openjdk 21.0.5 2024-10-15
OpenJDK Runtime Environment (build 21.0.5+11-Ubuntu-1ubuntu124.04)
OpenJDK 64-Bit Server VM (build 21.0.5+11-Ubuntu-1ubuntu124.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 21.0.5, vendor: Ubuntu, runtime: /usr/lib/jvm/java-21-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "6.8.0-51-generic", arch: "amd64", family: "unix"

アプリケヌションを䜜成する

今回はJakarta RESTful Web Services以降JAX-RSを䜿った簡単なアプリケヌションを䜜成するこずにしたす。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.littlewings</groupId>
    <artifactId>wildfly-maven-plugin-container-image</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.wildfly.bom</groupId>
                <artifactId>wildfly-ee-with-tools</artifactId>
                <version>35.0.0.Final</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.4.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>5.1.1.Final</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>image</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    
                    <!-- あずで -->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

WildFly Maven Pluginを远加し、wildfly:imageゎヌルを実行するように蚭定しおいたす。これでmvn package時にコンテナむメヌゞを
䜜成するようになりたす。

                <executions>
                    <execution>
                        <goals>
                            <goal>image</goal>
                        </goals>
                    </execution>
                </executions>

こちらはWildFly Glowを䜿うようにしおいるだけですが、この時点ではこのたたいきたす。

                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    
                    <!-- あずで -->
                </configuration>

JAX-RSの有効化。

src/main/java/org/littlewings/wildfly/RestApplication.java

package org.littlewings.wildfly;

import jakarta.ws.rs.ApplicationPath;
import jakarta.ws.rs.core.Application;

@ApplicationPath("/")
public class RestApplication extends Application {
}

JAX-RSリ゜ヌスクラス。

src/main/java/org/littlewings/wildfly/HelloResource.java

package org.littlewings.wildfly;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class HelloResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String message() {
        return "Hello World";
    }
}

動䜜確認しおおきたす。

$ mvn compile wildfly:dev

OKですね。

$ curl localhost:8080/hello
Hello World

これで準備は完了です。

WildFly Maven Pluginでコンテナむメヌゞを䜜成する

では、コンテナむメヌゞを䜜成したしょう。

以䞋のように蚭定しおいるので

                <executions>
                    <execution>
                        <goals>
                            <goal>image</goal>
                        </goals>
                    </execution>
                </executions>

mvn packageでコンテナむメヌゞが䜜成できたす。

$ mvn package

蚭定しない堎合は、packageに続けおwildfly:imageを実行するずよいでしょう。

$ mvn package wildfly:image

実行するず、途䞭でこんな衚瀺が出おきたした。

[INFO] Generating Dockerfile /path/to/wildfly-maven-plugin-container-image/target/Dockerfile from base image quay.io/wildfly/wildfly-runtime:latest
[INFO] Building application image wildfly-maven-plugin-container-image:latest using docker.
[INFO] Executing the following command to build application image: 'docker build -t wildfly-maven-plugin-container-image:latest .'

quay.io/wildfly/wildfly-runtime:latestずいうのがベヌスむメヌゞのようです。

Dockerfileも䜜成されるようです。

target/Dockerfile

FROM quay.io/wildfly/wildfly-runtime:latest
COPY --chown=jboss:root server $JBOSS_HOME
RUN chmod -R ug+rwX $JBOSS_HOME
COPY --chown=jboss:root ROOT.war $JBOSS_HOME/standalone/deployments/ROOT.war

コンテナむメヌゞができたした。デフォルトのむメヌゞ名はアヌティファクト名で、タグはlatestみたいですね。

[INFO] Successfully built application image wildfly-maven-plugin-container-image:latest

実行。

$ docker container run -it --rm -p 8080:8080 wildfly-maven-plugin-container-image:latest

確認。

$ curl localhost:8080/hello
Hello World

OKです。

コンテナの䞭身を芋おみる

少しコンテナの䞭身を芋おみたしょう。

$ docker container run -it --rm -p 8080:8080 --entrypoint bash wildfly-maven-plugin-container-image:latest

/etc/os-release。

$ cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.5 (Plow)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="9.5"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Red Hat Enterprise Linux 9.5 (Plow)"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9"
BUG_REPORT_URL="https://issues.redhat.com/"

REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_BUGZILLA_PRODUCT_VERSION=9.5
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.5"

Javaは、珟時点では21でした。

$ java --version
openjdk 21.0.5 2024-10-15 LTS
OpenJDK Runtime Environment (Red_Hat-21.0.5.0.11-1) (build 21.0.5+11-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-21.0.5.0.11-1) (build 21.0.5+11-LTS, mixed mode, sharing)

蚭定を倉曎しおみる

ここからは少しWildFly Maven Pluginの蚭定を倉えおみたす。

むメヌゞ名ずタグを指定しおみたしょう。image-nameずtagで指定できたす。

                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    <image-name>my-image</image-name>
                    <tag>0.0.1</tag>
                </configuration>

パッケヌゞング。

$ mvn package

このようになりたした。

[INFO] Successfully built application image my-image:0.0.1
JDKのバヌゞョンを指定する

jdk-versionでJDKのバヌゞョンを指定できたす。今回は21を指定。

                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    <jdk-version>21</jdk-version>
                </configuration>

パッケヌゞング。

$ mvn package

途䞭の様子。

[INFO] Generating Dockerfile /path/to/wildfly-maven-plugin-container-image/target/Dockerfile from base image quay.io/wildfly/wildfly-runtime:latest-jdk21
[INFO] Building application image wildfly-maven-plugin-container-image:latest using docker.
[INFO] Executing the following command to build application image: 'docker build -t wildfly-maven-plugin-container-image:latest .'

ベヌスむメヌゞがquay.io/wildfly/wildfly-runtime:latest-jdk21になりたした。

その他

実際に䜿う時はこんなずころでしょうか。

                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    <image-name>${project.artifactId}</image-name>
                    <tag>${project.version}</tag>
                    <jdk-version>21</jdk-version>
                </configuration>

レゞストリヌにpushする堎合は、pushをtrueにしお、レゞストリヌを指定する堎合はregistryを指定するようです。

                <configuration>
                    <overwrite-provisioned-server>true</overwrite-provisioned-server>
                    <discover-provisioning-info>
                        <version>35.0.0.Final</version>
                    </discover-provisioning-info>
                    <push>true</push>
                    <registry>my-registry</registry>
                </configuration>

registryを蚭定した堎合、むメヌゞ名にレゞストリヌ名が入るようです。

ベヌスむメヌゞに぀いお

蚭定を芋おいたのですが、ベヌスむメヌゞは倉曎できないようです。

以䞋で固定されおいるようですね。

WildFly Runtime Image

先ほど少し䞭身を芋たしたが、これはUBIのようです。

そしおjdk-versionを指定した時には、quay.io/wildfly/wildfly-runtime:latest-${jdk-version}がベヌスむメヌゞになりたす。

https://github.com/wildfly/wildfly-maven-plugin/blob/v5.1.1.Final/plugin/src/main/java/org/wildfly/plugin/provision/ApplicationImageInfo.java#L81-L90

珟時点では、11、17、21が指定できるようですね。パッチバヌゞョンたで指定できおもいいず思うのですが latest-の郚分は倉えられたせんね。

このむメヌゞのこずは、「UBI9 runtime image」ずしお玹介されおいたす。

New WildFly S2I and Runtime Multi-arch Images

WildFly S2I (Source to Image) builder and runtime images documentation

「wildfly-runtime」ずいう名前なので最初はどういう存圚なのかよくわからなかったのですが、WildFlyはあくたでプロビゞョニングしたものを
䜿甚し、こちらはUBIずOpenJDKが含たれたむメヌゞだずいうこずですね。

wildfly-runtime自䜓の定矩に぀いおは、こちらを芋るずよいず思いたす。
ベヌスむメヌゞはregistry.access.redhat.com/ubi9/ubi-minimalのようです。

https://github.com/wildfly/wildfly-s2i/blob/main/wildfly-runtime-image/image.yaml

おわりに

WildFly Maven Pluginでコンテナむメヌゞを䜜成しおみたした。

コンテナむメヌゞの䜜成自䜓は簡単でしたが、䜿われおいるベヌスむメヌゞがよくわからなかったのでいろいろ調べたりしおみたした。

だいたい内容はわかったので、今埌WildFlyでコンテナむメヌゞを䜜る堎合には䜿っおいきたしょう。