WebSphere 8.5.5.14 FullProfile の Docker を作成する

# 前置き

WebSphere 8.5.5.14 FullProfile の Docker を作成していきます。
intra-mart の検証用として利用したいので、intra-mart が要求する設定をあらかじめ実施します[intra-mart Accel Platform セットアップガイド (WebSphere編)](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide_was/index.html)
これによって、IBM 公式の Docker イメージと異なり、docker run 後何も考えずにすぐに検証用として利用できるような WebSphere の環境が作れるようになります。

# Docker ベースイメージ(CentOS 6.10)

いつものようにベースイメージから作ります。
CentOS 6.10 Final を利用します。

```dockerfile:Dockerfile
FROM centos:centos6

EXPOSE 22

# yum
RUN yum -y update \
 && yum provides -y '*/applydeltarpm' \
 && yum groupinstall -y 'Development Tools' \
 && yum install -y --enablerepo centosplus wget curl vim emacs tar unzip mlocate perl ssh openssh-server openssl-devel \
 && rm -rf /var/cache/yum/* \
 && yum clean all

# locale
RUN yum reinstall -y glibc-common \
 && localedef -i ja_JP -f UTF-8 ja_JP.utf8 \
 && touch /etc/sysconfig/i18n \
 && echo 'LANG="ja_JP.UTF-8"' >> /etc/sysconfig/i18n
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja

# timezone
RUN yum install -y tzdata \
 && echo 'ZONE="Asia/Tokyo"' > /etc/sysconfig/clock \
 && echo 'UTC=false' >> /etc/sysconfig/clock \
 && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# root passwd
RUN bash -c 'echo "root:password" | chpasswd'

# ssh
RUN sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication yes/g" /etc/ssh/sshd_config \
 && sed -i -e "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config \
 && sed -i -e "s/UsePAM yes/UsePAM no/g" /etc/ssh/sshd_config

RUN updatedb

CMD /etc/init.d/sshd restart && /bin/bash
```

ビルドします。

```shell
docker build -t mycentos:6.10 .
```

作成したベースイメージを元にもう一つベースイメージを作成します。
DB を別途用意するのも面倒なので PostgreSQL や Cassandra も一緒に入れてすぐ使える状態で起動するようにします。

```dockerfile:Dockerfile
FROM mycentos:6.10

EXPOSE 22 5432 8983 9160

# yum
RUN yum -y update \
 && yum -y upgrade && yum -y update \
 && yum localinstall -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm \
 && yum install -y postgresql96-server \
 && yum install -y --setopt=protected_multilib=false epel-release ld-linux.so.2 libstdc++.so.6 libpng12 nc \
 && rm -rf /var/cache/yum/* \
 && yum clean all

# JDK
COPY setup_jdk.sh /setup_jdk.sh
RUN chmod +x /setup_jdk.sh \
 && /setup_jdk.sh \
 && rm -f /setup_jdk.sh \
 && echo 'JAVA_HOME=/usr/local/java/jdk' >> /root/.bashrc \
 && echo 'PATH=$PATH:/usr/local/java/jdk/bin' >> /root/.bashrc
ENV JAVA_HOME /usr/local/java/jdk
ENV PATH /usr/local/java/jdk/bin:$PATH

# PostgreSQL
COPY setup_postgresql.sh /setup_postgresql.sh
RUN chmod +x /setup_postgresql.sh \
 && /setup_postgresql.sh \
 && rm -f /setup_postgresql.sh

# JDBC Driver
RUN mkdir -p /opt/jdbc
COPY postgresql-42.2.5.jar /opt/jdbc/postgresql.jar
COPY db2jcc4.jar /opt/jdbc/db2.jar
COPY ojdbc8.jar /opt/jdbc/oracle.jar
COPY mssql-jdbc-7.0.0.jre8.jar /opt/jdbc/sqlserver.jar
COPY ngdbc.jar /opt/jdbc/ngdbc.jar

# Cassandra
COPY setup_cassandra.sh /setup_cassandra.sh
RUN chmod +x /setup_cassandra.sh \
 && /setup_cassandra.sh \
 && rm -f /setup_cassandra.sh \
 && echo 'PATH=$PATH:/usr/local/apache-cassandra/apache-cassandra/bin' >> /root/.bashrc
ENV PATH $PATH:/usr/local/apache-cassandra/apache-cassandra/bin

# Solr
COPY setup_solr.sh /setup_solr.sh
RUN chmod +x /setup_solr.sh \
 && /setup_solr.sh \
 && rm -f /setup_solr.sh

# wkhtmltopdf
COPY setup_wkhtmltopdf.sh /setup_wkhtmltopdf.sh
RUN chmod +x /setup_wkhtmltopdf.sh \
 && /setup_wkhtmltopdf.sh \
 && rm -f /setup_wkhtmltopdf.sh

RUN updatedb

CMD ["/opt/IBM/InstallationManager/eclipse/tools/imcl", "-c"]
```

```shell:setup_wkhtmltopdf.sh
#!/bin/sh

curl -L -C - -O https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar -Jxvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
rm -f wkhtmltox-0.12.4_linux-generic-amd64.tar.xz

mv wkhtmltox /usr/local/wkhtmltox
ln -s /usr/local/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf

yum install -y vlgothic-fonts
```

PostgreSQL をインストールします。インストール後、以下のユーザを作成します。

* postgres/postgres （ユーザ/パスワード）
* imart/imart  （ユーザ/パスワード）

さらに、以下の DB を作成します。

* imart
* iap_db
* default

さらに、acceldocuments スキーマも作成しておきます。

max_connections と shared_buffers はデフォルトでは小さすぎるため気休め程度に増やしておきます。

```shell:setup_postgresql.sh
#!/bin/bash

service postgresql-9.6 initdb

echo "listen_addresses = '*'" >> /var/lib/pgsql/9.6/data/postgresql.conf
sed -i -e "s/ident$/trust/g" /var/lib/pgsql/9.6/data/pg_hba.conf
sed -i -e "s/127\.0\.0\.1\/32/0\.0\.0\.0\/0/g" /var/lib/pgsql/9.6/data/pg_hba.conf

sed -i -e "s/max_connections = 100/max_connections = 200/g" /var/lib/pgsql/9.6/data/postgresql.conf
sed -i -e "s/shared_buffers = 128MB/shared_buffers = 512MB/g" /var/lib/pgsql/9.6/data/postgresql.conf

echo "postgres:postgres" | chpasswd

service postgresql-9.6 start
sleep 1

su postgres -c "psql -c \"ALTER USER postgres WITH PASSWORD 'postgres'\""
su postgres -c "psql -c \"CREATE ROLE imart WITH LOGIN PASSWORD 'imart'\""
su postgres -c "psql -c \"CREATE DATABASE imart OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -c \"CREATE DATABASE iap_db OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -c \"CREATE DATABASE \\\"default\\\" OWNER=imart encoding 'utf8' TEMPLATE template0\""
su postgres -c "psql -d imart -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""
su postgres -c "psql -d iap_db -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""
su postgres -c "psql -d default -c \"CREATE SCHEMA acceldocuments AUTHORIZATION imart\""

service postgresql-9.6 stop
```

続いて JDK のダウンロードですが、8u191 が最新バージョンとして公開されている場合以下のような curl でダウンロード可能です。
8u191 が既に最新バージョンではなくなっている場合、URL を変更しないとダウンロードできないため、適宜変更してください。
面倒であれば jdk をブラウザでダウンロードし、Dockerfile から COPY して / 直下に配置し、以下の curl をやめ COPY で配置した jdk を利用するようにしても問題ありません。

```shell:setup_jdk.sh
#!/bin/sh

curl -L -C - -b "oraclelicense=accept-securebackup-cookie" -O https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz
tar zxvf jdk-8u191-linux-x64.tar.gz
rm -f jdk-8u191-linux-x64.tar.gz

mkdir -p /usr/local/java
mv jdk1.8.0_191 /usr/local/java/jdk1.8.0_191
ln -s /usr/local/java/jdk1.8.0_191 /usr/local/java/jdk
```

```shell:setup_cassandra.sh
#!/bin/sh

curl -L -C - -O https://archive.apache.org/dist/cassandra/1.1.12/apache-cassandra-1.1.12-bin.tar.gz
tar -zxvf apache-cassandra-1.1.12-bin.tar.gz
rm apache-cassandra-1.1.12-bin.tar.gz

mkdir -p /usr/local/apache-cassandra
mv apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra-1.1.12
ln -s /usr/local/apache-cassandra/apache-cassandra-1.1.12 /usr/local/apache-cassandra/apache-cassandra

sed -i -e "s/Xss180k/Xss228k/g" /usr/local/apache-cassandra/apache-cassandra/conf/cassandra-env.sh
```

Solr のセットアップですが、以下のように curl でセットアップ資材を取得するようにしているため、solr_setup.zip を myserver からダウンロードできるように事前に準備しておきます。
これも面倒であれば solr_setup.zip をブラウザでダウンロードし、Dockerfile から COPY して / 直下に配置し、以下の curl をやめ COPY で配置した solr_setup.zip を利用するようにしても問題ありません。

```shell:setup_solr.sh
#!/bin/sh

curl -L -C - -O http://myserver/solr_setup.zip
unzip solr_setup.zip -d solr_setup
rm solr_setup.zip

cd solr_setup
chmod u+x ./setup.sh
./setup.sh jetty

mkdir -p /usr/local/solr
mv dist/jetty/jetty /usr/local/solr/jetty

cd ..
rm -rf solr_setup
```

ビルドします。

```shell
docker build -t mywas_base .
```

# Docker WebSphere 8.5.5.14 FullProfile

さて次は WebSphere 8.5.5.14 FullProfile の Docker です。
先ほどの mywas_base をベースイメージとして利用します。

Dockerfile 以外にも以下のファイルを用意します。

* run_server.sh
* setup_was.sh
* startServer.sh
* stopServer.sh
* was85.rsp
* Dockerfile

まずは Dockerfile から。

```dockerfile:Dockerfile
FROM mywas_base

EXPOSE 22 5432 9009 9060 9080 40608

# yum
RUN yum -y update \
 && yum -y upgrade && yum -y update \
 && yum install -y multitail ncurses-devel ncurses-static ncurses-term \
 && rm -rf /var/cache/yum/* \
 && yum clean all

# setup_was
COPY setup_was.sh /opt/setup_was.sh
COPY was85.rsp /opt/was85.rsp
RUN chmod +x /opt/setup_was.sh \
 && /opt/setup_was.sh \
 && rm -f /opt/setup_was.sh

COPY run_server.sh /opt/run_server.sh
COPY startServer.sh /opt/startServer.sh
COPY stopServer.sh /opt/stopServer.sh
RUN chmod +x /opt/run_server.sh \
 && chmod +x /opt/startServer.sh \
 && chmod +x /opt/stopServer.sh \
 && ln -s /opt/startServer.sh /startServer.sh \
 && ln -s /opt/stopServer.sh /stopServer.sh \
 && ln -s /opt/startServer.sh /root/startServer.sh \
 && ln -s /opt/stopServer.sh /root/stopServer.sh \
 && ln -s /opt/run_server.sh /run_server.sh \
 && ln -s /opt/run_server.sh /root/run_server.sh

# COPY cell_node_resources.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/resources.xml
# COPY cell_node_server.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/server.xml
# COPY cell_security.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/security.xml

RUN updatedb

CMD ["/opt/run_server.sh"]
```

コメントアウトしている COPY 3 行は、後で使います。今はコメントアウトしたままで構いません。
コメントアウトした状態で、一度 docker build, docker run を行い、WebSphere の管理画面より intra-mart 用の設定を行います（-Xmx やトランザクションタイムアウト、データソースなどの設定）。
その設定がコメントアウトされているパスに反映されるため（設定反映前の /opt/IBM/WebSphere フォルダ、設定反映後の /opt/IBM/WebSphere フォルダの差分を WinMerge などのツールで取得することで判別します）、設定反映後の上記パスのファイルを取得後に、コメントアウトをやめ（コメントイン）、再度 docker build する流れになります。
こうすることで、intra-mart 用の設定がされた状態の WebSphere の Docker イメージを作成することができます。

続いて、WebSphere 8.5.5.14 FullProfile のセットアップです。

以下のように curl でセットアップ資材を取得するようにしているため、資材を myserver からダウンロードできるように事前に準備しておきます。
これも面倒であればセットアップ資材をブラウザでダウンロードし、Dockerfile から COPY して /opt 直下に配置し、以下の curl をやめ COPY で配置したセットアップ資材を利用するようにしても問題ありません。

セットアップ資材は以下からダウンロードできます。

* Installation Manager
 * https://www-01.ibm.com/support/docview.wss?uid=swg27036453
* WebSphere 8.5.5.0
 * https://www-01.ibm.com/support/docview.wss?uid=swg24034969 
* WebSphere Fix Pack 8.5.5.15
 * https://www-01.ibm.com/support/docview.wss?uid=swg27009661
* Java
 * https://www-01.ibm.com/support/docview.wss?uid=ibm10726035

```setup_was.sh
#!/bin/bash

echo "IBM WAS install script"

cd /opt

# download repository
echo "Downloading repository..."
WAS_REPOSITORY_BASE_URL="http://myserver"
curl -L -C - -o im.zip "${WAS_REPOSITORY_BASE_URL}/agent.installer.linux.gtk.x86_64_1.8.8000.20171130_1105.zip"
curl -L -C - -o was1.zip "${WAS_REPOSITORY_BASE_URL}/was.repo.8550.developers.ilan_part1.zip"
curl -L -C - -o was2.zip "${WAS_REPOSITORY_BASE_URL}/was.repo.8550.developers.ilan_part2.zip"
curl -L -C - -o was3.zip "${WAS_REPOSITORY_BASE_URL}/was.repo.8550.developers.ilan_part3.zip"
curl -L -C - -o java1.zip "${WAS_REPOSITORY_BASE_URL}/8.0.5.17-WS-IBMWASJAVA-part1.zip"
curl -L -C - -o java2.zip "${WAS_REPOSITORY_BASE_URL}/8.0.5.17-WS-IBMWASJAVA-part2.zip"
curl -L -C - -o wasfp_1.zip "${WAS_REPOSITORY_BASE_URL}/8.5.5-WS-WAS-FP014-part1.zip"
curl -L -C - -o wasfp_2.zip "${WAS_REPOSITORY_BASE_URL}/8.5.5-WS-WAS-FP014-part2.zip"
curl -L -C - -o wasfp_3.zip "${WAS_REPOSITORY_BASE_URL}/8.5.5-WS-WAS-FP014-part3.zip"

# im
echo "Installing IBM Installation Manager..."
mkdir iminstall
unzip -q im.zip -d iminstall

cd iminstall
ln -s jre_7.0.100010.20170822_1251/ jre
./installc --launcher.ini silent-install.ini -acceptLicense

cd /opt

rm -rf iminstall
rm -f im.zip

# was base files
mkdir was8550repo
echo "Unpacking base files..."
unzip -q was1.zip -d was8550repo
unzip -q was2.zip -d was8550repo
unzip -q was3.zip -d was8550repo
rm -f was1.zip was2.zip was3.zip

# jdk files
mkdir javarepo
echo "Unpacking java files..."
unzip -q java1.zip -d javarepo
unzip -q java2.zip -d javarepo
rm -f java1.zip java2.zip

# was fp
mkdir wasfprepo
echo "Unpacking fp files..."
unzip -q wasfp_1.zip -d wasfprepo
unzip -q wasfp_2.zip -d wasfprepo
unzip -q wasfp_3.zip -d wasfprepo
rm -f wasfp_1.zip wasfp_2.zip wasfp_3.zip

echo "Installing Java and WAS..."
/opt/IBM/InstallationManager/eclipse/tools/imcl -acceptLicense -showProgress input /opt/was85.rsp
rm -f was85.rsp

echo "Removing repos..."
rm -rf was8550repo javarepo wasfprepo

echo "Creating default profile..."
/opt/IBM/WebSphere/AppServer/bin/manageprofiles.sh -create -templatePath /opt/IBM/WebSphere/AppServer/profileTemplates/default
```

WebSphere 8.5.5.0, WebSphere Fix Pack 8.5.5.15, IBM WebSphere Java SDKs 8.0.5.17 をサイレントインストールしています。

サイレントインストールに必要なレスポンスファイルです。
WebSphere 8.5.5.14 以外のバージョンをインストールする場合、setup_was.sh スクリプト以外にもこのレスポンスファイルも編集する必要があります。

```xml:was85.rsp
<?xml version="1.0" encoding="UTF-8"?>

<agent-input clean="true" temporary="true">

<server>
  <repository location='/opt/was8550repo'/>
  <repository location='/opt/wasfprepo'/>
  <repository location='/opt/javarepo'/>
</server>

<install>
  <offering id='com.ibm.websphere.DEVELOPERSILAN.v85'
   profile='IBM WebSphere Application Server for Developers (ILAN) 8.5.5.14'/>

  <offering id='com.ibm.websphere.IBMJAVA.v80'
   profile='IBM WebSphere Application Server V8.5' installFixes='none'/>
</install>

<profile id='IBM WebSphere Application Server for Developers (ILAN) 8.5.5.14' installLocation='/opt/IBM/WebSphere/AppServer'>
  <data key='eclipseLocation' value='/opt/IBM/WebSphere/AppServer'/>
  <data key='user.import.profile' value='false'/>
  <data key='cic.selector.nl' value='ja'/>
  <data key='user.wasjava' value='java8'/>
</profile>

<preference name='com.ibm.cic.common.core.preferences.eclipseCache' value='/opt/IBM/IMShared'/>
<preference name='com.ibm.cic.common.core.preferences.preserveDownloadedArtifacts' value='false'/>
<preference name='com.ibm.cic.common.core.preferences.connectTimeout' value='30'/>
<preference name='com.ibm.cic.common.core.preferences.readTimeout' value='45'/>
<preference name='com.ibm.cic.common.core.preferences.downloadAutoRetryCount' value='0'/>
<preference name='offering.service.repositories.areUsed' value='true'/>
<preference name='com.ibm.cic.common.core.preferences.ssl.nonsecureMode' value='false'/>
<preference name='com.ibm.cic.common.core.preferences.http.disablePreemptiveAuthentication' value='false'/>
<preference name='http.ntlm.auth.kind' value='NTLM'/>
<preference name='http.ntlm.auth.enableIntegrated.win32' value='true'/>
<preference name='com.ibm.cic.common.core.preferences.keepFetchedFiles' value='false'/>
<preference name='PassportAdvantageIsEnabled' value='false'/>
<preference name='com.ibm.cic.common.core.preferences.searchForUpdates' value='false'/>
<preference name='com.ibm.cic.agent.ui.displayInternalVersion' value='false'/>

</agent-input>
```

続いて、docker run 時に実行する、WebSphere の起動スクリプトです。
sshd, PostgreSQL, Cassandra, Solr も起動します。
ログファイルを二つ(SystemOut.log, SystemErr.log)表示したいので、利用可能な場合 multitail を利用してログを出力します。
使えない環境の場合 tail を用いてログを出力します。

```shell:run_server.sh
#!/bin/bash

originalTerm="${TERM}"
if [ ${originalTerm} != "xterm" ]; then
    export TERM=xterm
fi

/etc/init.d/sshd start
service postgresql-9.6 restart

cassandra &
cd /usr/local/solr/jetty
./startup.sh &

/opt/IBM/WebSphere/AppServer/bin/startServer.sh server1 &
while [ ! -r /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemOut.log ]
do
    sleep 1
done
while [ ! -r /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemErr.log ]
do
    sleep 1
done

if [ ${originalTerm} = "xterm" ]; then
    multitail -M 0 --follow-all --retry-all /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemOut.log -I /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemErr.log
else
    tail -F /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemOut.log /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemErr.log
fi
```

```shell:startServer.sh
#!/bin/sh

cd /opt/IBM/WebSphere/AppServer/bin
./startServer.sh server1
```

```shell:stopServer.sh
#!/bin/sh

cd /opt/IBM/WebSphere/AppServer/bin
./stopServer.sh server1
```

ここまでできたら、一度 build し、実行します。

```shell
docker build -t mywas:8.5.5.14 .
docker run -it --rm -p 9060:9060 -p 9080:9080 -p 40608:40608 -p 5432:5432 -p 2222:22 -p 9009:9009 mywas:8.5.5.14
```

実行後、コンテナに ssh でログインし、（root/password でログインできます）

```shell
zip -r WebSphere.zip /opt/IBM/WebSphere
```

を実行し、設定前の状態(WebSphere.zip)を保存します。保存後、[
intra-mart Accel Platform セットアップガイド (WebSphere編)](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide_was/) の設定を行います。

設定反映後、コンテナに ssh でログインし、

```shell
zip -r WebSphere2.zip /opt/IBM/WebSphere
```

を実行し、設定後の状態(WebSphere2.zip)を保存します。
WebSphere.zip と WebSphere2.zip の内容を WinMerge 等のツールを用いて比較します。
おそらく、次の 3 ファイルで差分が検出されるはずです（ログファイルも差分がでますがどうでもよい差分なので無視します）

* /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/resources.xml
* /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/server.xml
* /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/security.xml

パス中の 32f0c14c1a1eNode01Cell や 32f0c14c1a1eNode01 の部分は、docker build 時のホスト名に影響すると思われるため、docker build する度に違う値になっている可能性が高いです。
（また上記 3 ファイル中にも docker build 時のホスト名の影響を受ける設定が入っているはずです）

上記 3 ファイルを取得後、

resources.xml -> cell_node_resources.xml
server.xml -> cell_node_server.xml
security.xml -> cell_security.xml

とファイル名を変え、Dockerfile の以下のようにコメントアウトされている個所のコメントを外します（コメントイン）。

```dockerfile
# COPY cell_node_resources.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/resources.xml
# COPY cell_node_server.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/server.xml
# COPY cell_security.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/security.xml
```

↓

```dockerfile
COPY cell_node_resources.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/resources.xml
COPY cell_node_server.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/server.xml
COPY cell_security.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/security.xml
```

変更後、もう一度 docker build します。

```shell
docker build -t mywas:8.5.5.14 .
```

コメントインした 3 つの COPY コマンドの直前のコマンド実行後の build image からのインクリメントビルド（一からビルドするのではなく、コメントインした COPY コマンドの行からのビルドになる）になるはずです。（そのため、build 時のホスト名も、コメントインした COPY コマンドを実行前と同じホスト名でビルドされます）

中間ビルドイメージを全部削除して一から build しなおしてしまうと、

```dockerfile
COPY cell_node_resources.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/resources.xml
COPY cell_node_server.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/nodes/32f0c14c1a1eNode01/servers/server1/server.xml
COPY cell_security.xml /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/32f0c14c1a1eNode01Cell/security.xml
```

このコマンドのパス名が変わってしまう可能性があるため、中間ビルドイメージを消したりせず、普通にインクリメントビルドした方が無難だと思います。

ひょっとすると、Dockerfile の先頭に

```dockerfile
ENV HOSTNAME websphere
```

を入れて、docker build 時のホスト名を常に同じになるようにすると問題が発生しにくいかもしれません。

# 起動

```shell
docker run -it -p 9060:9060 -p 9080:9080 -p 40608:40608 -p 5432:5432 -p 2222:22 -p 9009:9009 mywas:8.5.5.14
```

PostgreSQL, Solr, Cassandra もインストール済みのため、war をデプロイするだけですぐに検証を行うことができます。

# ssh

```shell
ssh -p 2222 root@localhost
```

docker run 時に -p 2222:22 とした場合、2222 が ssh のポートです。
root/password でログインできます。
localhost の部分は、docker run しているマシンの IP アドレスに置き換えてください。

# デプロイ

以下を参照して、war をデプロイしてください。
[intra-mart Accel Platform セットアップガイド (WebSphere編) warファイルのデプロイ](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide_was/texts/websphere/deploy.html)
war デプロイ後、以下のクラスローダの設定を行ってください。
[intra-mart Accel Platform セットアップガイド (WebSphere編) クラスローダーの設定](https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide_was/texts/websphere/classloader.html)

# URL

* WebSphere 管理画面
 * http://localhost:9060/admin
* war デプロイ後の一般ユーザログイン画面
 * http://localhost:9080/imart/login
* war デプロイ後のシステムユーザログイン画面
 * http://localhost:9080/imart/system/login

localhost の部分は、docker run しているマシンの IP アドレスに置き換えてください。



というわけで簡単にですが WebSphere 8.5.5.14 FullProfile intra-mart 用構成済みの Docker についての紹介でした。