【OpenShift】JBossベースイメージからJavaコンテナを作成しデプロイ
本記事の目的
- 前回の記事では、JBossコンテナ上にjarを配置し、JavaアプリケーションをOpenshift上で動かすことができました。
前回はJBossコンテナを起動した後にoc cp
でJBossコンテナ内にjarを配置しましたが、この方法だとpod再起動でjarが消えてしまうため、実運用には不向きです。
そこで今回は、JBossベースイメージからJavaアプリケーションコンテナを作成し、それをデプロイする方法を試してみようと思います。
コンテナイメージビルドまでの流れ
アプリケーションのソースコードからコンテナイメージを作成するまでの大まかな流れは以下です。
- ベースイメージの取得。
- ソースコードをコンパイルしjarファイル(アーティファクト)を作成。
- jarファイルとベースイメージを組み合わせて、アプリケーションコンテナイメージを作成
- コンテナイメージをコンテナレジストリへ格納
OpenShiftにはビルド戦略というものがあり、複数の方法があります。
今回はアーティファクトを作ってあるので、Binaryビルドという方式で実施します。
ベースイメージの取得
ベースイメージとは、アプリケーションを格納する元になるイメージのことです。
Red Hatが提供するベースイメージは以下のサイトで公開されています。
- ベースイメージにしたいコンテナを選び、「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コマンドを順番に実行することで実施することができます。
-
oc new-build
:ビルドの準備 -
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
ログを見てみると、以下のステップで行われているようです。
- 引数で指定したディレクトリがコンテナ内にアップロード(jarが渡されている)
ploading directory "deployment" as binary input for the build ... Uploading finished
- コンテナイメージのビルド開始
build.build.openshift.io/custom-image-java-1 started
- Dockerfileの生成
Generating dockerfile with builder image registry.
- 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'
) - イメージのコミット
COMMIT temp.builder.openshift.io/custom-image-sample/custom-i
- イメージのプッシュ
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