🐼

【OpenShift】JBossベースイメージからJavaコンテナを作成しデプロイ

に公開

本記事の目的

  • 前回の記事では、JBossコンテナ上にjarを配置し、JavaアプリケーションをOpenshift上で動かすことができました。

https://zenn.dev/ramenpanda/articles/6e07b472474e77

前回はJBossコンテナを起動した後にoc cpでJBossコンテナ内にjarを配置しましたが、この方法だとpod再起動でjarが消えてしまうため、実運用には不向きです。

そこで今回は、JBossベースイメージからJavaアプリケーションコンテナを作成し、それをデプロイする方法を試してみようと思います。

コンテナイメージビルドまでの流れ

アプリケーションのソースコードからコンテナイメージを作成するまでの大まかな流れは以下です。

  1. ベースイメージの取得。
  2. ソースコードをコンパイルしjarファイル(アーティファクト)を作成。
  3. jarファイルとベースイメージを組み合わせて、アプリケーションコンテナイメージを作成
  4. コンテナイメージをコンテナレジストリへ格納

OpenShiftにはビルド戦略というものがあり、複数の方法があります。
https://docs.redhat.com/ja/documentation/openshift_container_platform/4.2/html/builds/understanding-image-builds#build-strategy-s2i_understanding-image-builds

今回はアーティファクトを作ってあるので、Binaryビルドという方式で実施します。
https://docs.redhat.com/ja/documentation/openshift_container_platform/3.11/html/developer_guide/binary-builds-tutorial

ベースイメージの取得

ベースイメージとは、アプリケーションを格納する元になるイメージのことです。
Red Hatが提供するベースイメージは以下のサイトで公開されています。

https://catalog.redhat.com/

  • ベースイメージにしたいコンテナを選び、「Get this image」のタブを押下すると、oc import-imageコマンドが表示されるので、それをコピーして実行します。

今回はJBoss EAP 7.4 with OpenJDK11を使うことにしました。

oc import-image jboss-eap-7/eap74-openjdk11-openshift-rhel8:7.4.21-2.1743444175 --from=registry.redhat.io/jboss-eap-7/eap74-openjdk11-openshift-rhel8:7.4.21-2.1743444175 --confirm

ベースイメージがpullできていることを確認できます。

$ oc get is
NAME                              IMAGE REPOSITORY                                                                                              TAGS                  UPDATED
eap74-openjdk11-openshift-rhel8   default-route-openshift-image-registry.apps-crc.testing/custom-image-sample/eap74-openjdk11-openshift-rhel8   7.4.21-2.1743444175   22 minutes ago

Binaryビルドの実行

Binaryビルドは次の2コマンドを順番に実行することで実施することができます。

  1. oc new-build:ビルドの準備
  2. oc start-build:ビルドの実行

oc new-buildの実行

oc new-buildの主な目的は、buildconfig(ビルドの設定)を作成することです。

oc new-build --image-stream="custom-image-sample/eap74-openjdk11-openshift-rhel8:7.4.21-2.1743444175" --binary=true --name=custom-image-java -n custom-image-sample
  • 実行結果
--> Found image 8d8e206 (3 weeks old) in image stream "custom-image-sample/eap74-openjdk11-openshift-rhel8" under tag "7.4.21-2.1743444175" for "custom-image-sample/eap74-openjdk11-openshift-rhel8:7.4.21-2.1743444175"

    JBoss EAP 7.4
    -------------
    Platform for building and running JavaEE applications on JBoss EAP 7.4

    Tags: builder, javaee, eap, eap7

    * A source build using binary input will be created
      * The resulting image will be pushed to image stream tag "custom-image-java:latest"
      * A binary build was created, use 'oc start-build --from-dir' to trigger a new build

--> Creating resources with label build=custom-image-java ...
    imagestreamtag.image.openshift.io "custom-image-java:latest" created
    buildconfig.build.openshift.io "custom-image-java" created
--> Success

buildconfig.build.openshift.io "custom-image-java" createdというログから、buildconfigが作成されていることが分かります。

$ oc get bc
NAME                TYPE     FROM     LATEST
custom-image-java   Source   Binary   0

また、imagestreamtag.image.openshift.io "custom-image-java:latest" createdというログから、imagestreamも作成されていることが分かります。

oc get is
NAME                              IMAGE REPOSITORY                                                                                              TAGS                  UPDATED
custom-image-java                 default-route-openshift-image-registry.apps-crc.testing/custom-image-sample/custom-image-java

TAGS, UPDATEDは空なので、custom-image-javaというイメージは作成未済であり、これから作成するコンテナイメージを格納する領域を作っていることが分かります。

oc start-buildの実行

oc start-build custom-image-java --from-dir=deployment -n custom-image-sample --follow
  • --from-dirには、ビルドに使用するファイル(jar)のパスを指定します。

  • --followをつけることで、詳細なログを表示することができます。

  • 実行結果

ploading directory "deployment" as binary input for the build ...
Uploading finished
...
build.build.openshift.io/custom-image-java-1 started
...
Generating dockerfile with builder image registry.redhat.io/jboss-eap-7/eap74-openjdk11-openshift-rhel8@sha256:9e0df1a68c1941db963d028e262664c0dff08eac16b3f0b6d9d019e3db4ef9c4
Adding transient rw bind mount for /run/secrets/rhsm
STEP 1/9: FROM registry.redhat.io/jboss-eap-7/eap74-openjdk11-openshift-rhel8@sha256:9e0df1a68c1941db963d028e262664c0dff08eac16b3f0b6d9d019e3db4ef9c4
STEP 2/9: LABEL "io.openshift.build.image"="registry.redhat.io/jboss-eap-7/eap74-openjdk11-openshift-rhel8@sha256:9e0df1a68c1941db963d028e262664c0dff08eac16b3f0b6d9d019e3db4ef9c4"       "io.openshift.build.source-location"="/tmp/build/inputs"       "io.openshift.s2i.destination"="/tmp"
STEP 3/9: ENV OPENSHIFT_BUILD_NAME="custom-image-java-1"     OPENSHIFT_BUILD_NAMESPACE="custom-image-sample"
STEP 4/9: USER root
STEP 5/9: COPY upload/src /tmp/src
STEP 6/9: RUN chown -R 185:0 /tmp/src
STEP 7/9: USER 185
STEP 8/9: RUN /usr/local/s2i/assemble
INFO S2I source build with plain binaries detected
INFO Copying deployments from . to /deployments...
'/tmp/src/./minkaji-api-web.war' -> '/deployments/minkaji-api-web.war'
INFO Cleaning up source directory (/tmp/src)
INFO Server not copied to /s2i-output, provisioned server is bound to local repository and can't be used in chained build. You can use galleon env variables to provision a server that can then be used in chained build.
STEP 9/9: CMD /usr/local/s2i/run
COMMIT temp.builder.openshift.io/custom-image-sample/custom-image-java-
...
Pushing image image-registry.openshift-image-registry.svc:5000/custom-image-sample/custom-image-java:latest ...
Successfully pushed image-registry.openshift-image-registry.svc:5000/custom-image-sample/custom-image-java@sha256:feab1247737ba4fb1cb9ba4fd5e5786d5f8feaa093a4c0ccded3e4f362b5a5e5
Push successful

ログを見てみると、以下のステップで行われているようです。

  1. 引数で指定したディレクトリがコンテナ内にアップロード(jarが渡されている)
    ploading directory "deployment" as binary input for the build ... Uploading finished
  2. コンテナイメージのビルド開始
    build.build.openshift.io/custom-image-java-1 started
  3. Dockerfileの生成
    Generating dockerfile with builder image registry.
  4. Dockerfileの各ステップの実行(STEP x/9)
    Step5/9で、1でアップロードされたファイルが、/tmp/srcにコピーされ、
    upload/src /tmp/src
    STEP 8/9で、それが/deploymentsにコピーされています。
    '/tmp/src/./minkaji-api-web.war' -> '/deployments/minkaji-api-web.war'
  5. イメージのコミット
    COMMIT temp.builder.openshift.io/custom-image-sample/custom-i
  6. イメージのプッシュ
    Pushing image image-registry.openshift-image-registry.svc:5000/custom-image-sample/custom-image-java:latest ... Successfully pushed ...

oc get isで確認してみると、イメージがpushされていることが確認できます。

oc get is
NAME                              IMAGE REPOSITORY                                                                                              TAGS                  UPDATED
custom-image-java                 default-route-openshift-image-registry.apps-crc.testing/custom-image-sample/custom-image-java                 latest                1 minutes ago

最後にpodを起動し、routeを作成することでJavaアプリケーションのデプロイを確認できました。

oc new-app custom-image-java
oc get pod
NAME                                 READY   STATUS      RESTARTS   AGE
custom-image-java-6b76949855-68kfd   1/1     Running     0          3m33s
oc expose service/custom-image-java

また、前回違って、コンテナイメージの中にjarが含まれているため、podを再起動したとしてもjarファイルを含んだ状態のコンテナが立ち上がることも確認しました。

Discussion