こんにちは。平田です。
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ベースのアプリが起動しました。