概要
SVF製品においては、「SVFクラウド」がありますが、昔からあるシステムのお守りなどで、社内において、SVFサーバを動かす必要がある、といったところはあるように思います。
今回は、誰かに引継ぎも兼ねて、SVF for PDFをDockerコンテナにして動かす方法を書いておきます。
当然、システム要件を満たすものではないので、開発用途・検証用途などで利用するものとしていることをご了承ください。
自分のお守りするシステムのあるバージョンは、SVF9.2で、
また違うバージョンは、SVF9.2sp3で、
最新の開発中のものは、SVF9.2sp6で・・・ という人に向いています。
用意するもの
SVF for PDF Ver9.2では、利用するにあたって、オンラインかオフラインでアクティべーションを行う必要があります。
このため、ライセンスキーなどは事前に入手しているものとします。
キー | 値の例 |
---|---|
LICENSE_KEY | SVF92-12345-67890-ABCDE-FGHIJ |
EDITION_ID | OEM-SVF-XXX-XXXXX |
インストールに必要な資材については、媒体等で入手しているものとして進めます。
install_resources以下にこんな感じで用意しておきます。
install_resources
├── bin
├── conf
├── data
├── install.exe
├── install_other.sh
├── install_x64.sh
├── install_x86.sh
├── lib
├── license
├── logging.properties
├── ProductLicense
├── runtime
├── sample
└── tools
Dockerfile
用意するもので示した変数を--build-argで渡します。
docker build -t svf:9.2 --build-arg LISENCE_KEY=ライセンスキー --build-arg EDITION_ID=エディションID .
Dockerファイルはこのようになっています。
FROM centos:7
ARG LICENSE_KEY
ARG EDITION_ID
ENV FIT_PRODUCTS_BASE=/opt/SVFJP \
OS_NAME=rhel \
JAVA_HOME=/usr/lib/jvm/jre-1.7.0-openjdk \
LICENSE_KEY=$LICENSE_KEY \
EDITION_ID=$EDITION_ID \
PRINTER_NAME=PDF \
USE_SVF_JAVA_CONNECT_SERVER=1 \
USE_PLUGABLE_DATABASE=1
COPY install_resources /tmp/SVF
COPY runSVF.sh /runSVF.sh
RUN \
yum install -y java-1.7.0-openjdk && \
useradd svf -m -d /home/svf && \
echo 'svf:svf' |chpasswd && \
mkdir $FIT_PRODUCTS_BASE && \
chown -R svf:svf $FIT_PRODUCTS_BASE && \
chown -R svf:svf /tmp/SVF && \
chown svf:svf /runSVF.sh && \
chmod +x /runSVF.sh && \
yum clean all
USER svf
RUN \
echo 'yes' > /tmp/response_file && echo 'yes' >> /tmp/response_file && \
chmod +x /tmp/SVF/install_x64.sh && \
/tmp/SVF/install_x64.sh < /tmp/response_file && \
find $FIT_PRODUCTS_BASE/bin -name "*.sh" | xargs sed -i \
-re 's|^(su -)|\# \1|g' && \
rm -rf /tmp/SVF && \
mkdir $FIT_PRODUCTS_BASE/tmp && \
mkdir $FIT_PRODUCTS_BASE/log && \
mkdir -p $FIT_PRODUCTS_BASE/svfjpd/form && \
sed -i -e s#Default.TempDir=#Default.TempDir=${FIT_PRODUCTS_BASE}/tmp#g \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
sed -i -e s#SearchPath.Path=#SearchPath.Path=${FIT_PRODUCTS_BASE}/svfjpd#g \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
sed -i -e s#Debug.Debug=OFF#Debug.Debug=ON#g \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
sed -i -e s#Debug.LogDir=#Debug.LogDir=${FIT_PRODUCTS_BASE}/log#g \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.properties.ja && \
sed -i -e s#defaultprinter=#defaultprinter=${PRINTER_NAME}#g \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
echo "${PRINTER_NAME}=vfreport.hoge.${PRINTER_NAME}.properties.ja" >> \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
cp $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.PDF.properties.ja \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.hoge.${PRINTER_NAME}.properties.ja
WORKDIR $FIT_PRODUCTS_BASE
VOLUME $FIT_PRODUCTS_BASE/svfjpd/form
CMD exec /runSVF.sh
EXPOSE 515 4141 44081 44090
Javaのバージョンについて
9.2(無印)は、Java8に対応していないため、Java7を入れておきます。
yum install -y java-1.7.0-openjdk && \
svfユーザについて
SVF for PDFは、rootユーザではなく、専用のユーザを作成し、そのユーザで動かすこと、と言われておりますので、
svfユーザを作成し、svfユーザでインストール処理を行います。
useradd svf -m -d /home/svf && \
echo 'svf:svf' |chpasswd && \
PDFプリンタの作成
SVF for PDFの8系のときは、インストール直後にPDFプリンタが1つ作成されていましたが、9.2ではインストール直後にプリンタは何も作成されていません。
そのため、PDFプリンタをファイルベースで作成しておきます。
echo "${PRINTER_NAME}=vfreport.hoge.${PRINTER_NAME}.properties.ja" >> \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.printers.properties && \
cp $FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.PDF.properties.ja \
$FIT_PRODUCTS_BASE/svfjpd/lib/vfreport.hoge.${PRINTER_NAME}.properties.ja
エラー対応
SVFのインストーラで、OS_NAMEが判定で使われていることから、centos:7ですがOS_NAMEをrhelとしています。
起動用スクリプト
docker run/stop用のスクリプトとして runSVF.shを用意しました。
主にやっていることは3つです。
- SVFのサーバプロセスを開始する前に、指定されたライセンスキーでオンラインアクティベーションを行う。
- SVFサーバプロセスの開始する。
- 終了コマンドを受信したら、指定されたエディションIDを指定して、ディアクティベーション処理とSVFサーバプロセスを終了する。
コンテナですので、動作するハードウェア環境は、その時々で変わるでしょうから、毎回アクティベーションするようにしています。
当然、許容されたライセンス数で動かしているものとしますが、使い終わったら消すのが良いですので、ディアクティベーション処理を終了時に走らせます。
アクティベーション
echo "Activation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh activation ${LICENSE_KEY}
このようにしてライセンスキーを使い、アクティベーション処理を行います。
成功すると、以下のようなメッセージが出力されます。
Online Activation is successful.
キーが間違っていると、このようなメッセージになります。
Valid Activation Code is not registered.
ディアクティベーション
lm_svf.sh activation ライセンスキー
でアクティベーションなら、lm_svf.sh deactivation ライセンスキー
で、ディアクティベーションできるかと思いきや、deactivationで使用するのは、エディションIDの方です。
edition_idはlm_svf.sh listとすることで、求めることができます。
Activatedな製品があれば(アクティべーションされていれば)、解除処理をします。
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh list | grep "(Activated)"
if [ $? -eq 0 ]; then
echo "SVF Licence Deactivation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh deactivation ${EDITION_ID}
fi
[TIPS] Oracle12c PDB対応
プラガブルなDBを使うとき、使わないときで接続文字列が変わるので、文字列の置換処理を行っています。
if [ "${USE_PLUGABLE_DATABASE}" = "1" ]; then
sed -i -e "s#jdbc:oracle:thin:@{0}:{1}:{2}#jdbc:oracle:thin:@//{0}:{1}/{2}#g" \
${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
else
sed -i -e "s#jdbc:oracle:thin:@//{0}:{1}/{2}#jdbc:oracle:thin:@{0}:{1}:{2}#g" \
${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
fi
runSVF.sh
中身はこのようになっています。
#!/bin/bash
LOG_FILE=${FIT_PRODUCTS_BASE}/log/*
if [ ! -e ${FIT_PRODUCTS_BASE}/log/server.log ]; then
touch ${FIT_PRODUCTS_BASE}/log/server.log
fi
########### SIGINT handler ############
function _closer() {
echo "Stopping container."
echo "SIGINT received, shutting down svf"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh list | grep "(Activated)"
if [ $? -eq 0 ]; then
echo "SVF Licence Deactivation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh deactivation ${EDITION_ID}
fi
${FIT_PRODUCTS_BASE}/bin/svf_shutdown.sh
}
###################################
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
############# MAIN ################
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #
###################################
# Set handler
trap _closer SIGINT SIGTERM SIGKILL
echo "Activation"
${FIT_PRODUCTS_BASE}/ac/bin/lm_svf.sh activation ${LICENSE_KEY}
echo "replace startup environment"
sed -i -re s/USE_SVF_JAVA_CONNECT_SERVER=[01]/USE_SVF_JAVA_CONNECT_SERVER=${USE_SVF_JAVA_CONNECT_SERVER}/g \
${FIT_PRODUCTS_BASE}/bin/.startup_products
if [ "${USE_PLUGABLE_DATABASE}" = "1" ]; then
sed -i -e "s#jdbc:oracle:thin:@{0}:{1}:{2}#jdbc:oracle:thin:@//{0}:{1}/{2}#g" \
${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
else
sed -i -e "s#jdbc:oracle:thin:@//{0}:{1}/{2}#jdbc:oracle:thin:@{0}:{1}:{2}#g" \
${FIT_PRODUCTS_BASE}/svfjpd/lib/vfreport.properties.ja
fi
echo "StartUp SVF"
${FIT_PRODUCTS_BASE}/bin/svf_startup.sh
tail -f ${LOG_FILE} &
childPID=$!
wait $childPID
制約
フォントの設定も本来は必要ですが、今回はスキップしています。
有償フォントを買って別途入れなければ帳票が出ない!というような人は厳しいです。
次回
今回作成したイメージをベースにして、サービスパックをあてたイメージの作成方法について書きたいと思います。