Antでビルドするアプリ向けS2I

こんにちは。平田です。

OpenShiftをPaaSたらしめるのが Source-to-Image (S2I) です。

機能だけ実装すれば実行基盤が良い感じに動かしてくれる、というのがPaaSに期待されることだと思います。S2Iにより、ソースコードだけ用意すれば、サーバにデプロイされた状態のコンテナイメージが作られてOpenShift上で動作させることができます。

Java EEアプリの場合、Mavenでビルドするように構成して oc new-app するとJava EEサーバにデプロイした状態のコンテナイメージが生成されます。今回は、Apache Antでビルドする構成のアプリに対して、S2Iを動作させてみます。

Apache AntでビルドするアプリをS2Iで扱うには、以下のようなS2Iビルダーイメージを作成します。

  • Antをインストールする。
  • Antビルドをキックするスクリプトを同梱する。
  • Java EEサーバへのデプロイを行い、サーバを起動する。

ビルダーイメージとは、ソースコードを受け取ってサーバにデプロイした状態を作り出すコンテナイメージです。今回はMavenの代わりにAntでビルドしたいだけなので、既存のS2Iのビルド工程のみ差し替え、デプロイ以降は再利用します。

ビルダーイメージ作成

OpenShiftチームのブログ記事を参考にビルダーイメージを作ります(作ったもの)。

ブログ記事ではスタンドアロンのs2iコマンドを使ってスケルトンを生成しています。今回のサンプルもs2iを使いましたが、S2Iの規約に則っている以外は普通のDockerイメージなので、自力で各種のファイルを用意すればs2iコマンドは不要です。

s2i create wildfly-110-ant-centos7 s2i-wildfly-ant

続いて、生成されたDockerfileを編集します。Antをインストールしたいだけなので、基礎のWildFly 11のビルダーイメージをベースにして以下のようにしました。

FROM openshift/wildfly-110-centos7
LABEL maintainer="Takami Hirata <takami-h@natswell.com>"
USER root
RUN yum install -y ant && yum clean all -y
RUN cp /usr/libexec/s2i/assemble /usr/libexec/s2i/assemble-base
COPY ./s2i/bin/ /usr/libexec/s2i
USER 1001

ビルド工程を差し替え、後続のデプロイ工程は再利用したいため、オリジナルのスクリプト(/usr/libexec/s2i/assemble)をリネームしています。

次にAntビルドをキックするスクリプトを用意します。s2iが生成したスケルトンのうち、s2i/bin/assembleが、ソースコードを受け取ってビルド・デプロイするスクリプトです。

#!/bin/bash -e
if [[ "$1" == "-h" ]]; then
  exec /usr/libexec/s2i/usage
fi

echo "---> Installing application source..."
cp -Rf /opt/s2i/destination/src/. ./

echo "---> Building application from source..."
ant clean package

echo "---> Copy war to deploy."
mkdir -p deployments
cp _target/*.war deployments/

/usr/libexec/s2i/assemble-base

antコマンドをキックし、生成されたWarファイルを所定の場所にコピーして、リネームした元のスクリプトをキックしています。

動作確認

ビルダーイメージを使ってOpenShift上でアプリを作るには、OpenShiftから参照可能なコンテナレジストリ(Docker Hubや、社内のレジストリ、OpenShiftの内部レジストリなど)にイメージを登録する必要があります。ここでは、minishiftで起動したOpenShiftでビルダーイメージ自体をビルドし、OpenShiftの内部レジストリに登録します。

動作確認用のプロジェクトを作ります。

$ oc new-project s2i-poc-1

ビルダーイメージをビルドし、コンテナイメージを内部レジストリに登録します。

$ cd s2i-wildfly-ant
$ oc new-build --binary --name=wildfly-110-ant-centos7
$ oc start-build wildfly-110-ant-centos7 --from-dir=.

ビルダーイメージのImageStreamが作成されます。

$ oc get is
NAME DOCKER REPO TAGS UPDATED
wildfly-110-ant-centos7 172.30.1.1:5000/s2i-poc-1/wildfly-110-ant-centos7

準備が整ったので、Antベースのアプリを作ってみます。

oc new-app wildfly-110-ant-centos7~https://github.com/takami-h/s2i-wildfly-ant.git \
  --context-dir=test/test-app

Antベースのアプリが起動しました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です