Liberty on Alpine Linux

Libertyの実行環境をDocker上に作成します。
[websphere-liberty](https://hub.docker.com/_/websphere-liberty)を使っても良いのですが、日本語化したい＆Dockerfileや仕組みを理解したいと思い、Dockerfileを書いてみました。[websphere-liberty](https://hub.docker.com/_/websphere-liberty)以外に[ibmjava](https://hub.docker.com/_/ibmjava/)を参考にしています。

ibmjava:8-jreは
FROM ubuntu:18.04.3
⇒ IBM JREインストールです。
websphere-libertyは
FROM ibmjava:8-jre
⇒ Libertyインストールです。
これをalpine linux、IBM JRE、libertyのインストール&日本語化します。
よく見るとalpine-minirootfsの入手先書いていませんね。3.16.2なら以下となります。
[alpine-minirootfs](https://dl-cdn.alpinelinux.org/alpine/v3.16/releases/x86_64/alpine-minirootfs-3.16.2-x86_64.tar.gz
)

# Dockerfile例
```docker:dockerfile
FROM scratch
ADD alpine-minirootfs-3.16.2-x86_64.tar.gz /

RUN apk update \
    && apk add --no-cache unzip \
    && apk --no-cache --virtual .build-deps add binutils tzdata \
    && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" >  /etc/timezone

ENV GLIBC https://github.com/sgerrand/alpine-pkg-glibc/releases/download
ENV GLIBC_VER 2.34-r0
RUN wget -q ${GLIBC}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk
RUN wget -q ${GLIBC}/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk
RUN wget -q ${GLIBC}/${GLIBC_VER}/glibc-i18n-${GLIBC_VER}.apk

RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub

RUN    apk add --no-cache \
           "glibc-${GLIBC_VER}.apk" \
           "glibc-bin-${GLIBC_VER}.apk" \
           "glibc-i18n-${GLIBC_VER}.apk" \
    && rm  "glibc-${GLIBC_VER}.apk" \
           "glibc-bin-${GLIBC_VER}.apk" \
           "glibc-i18n-${GLIBC_VER}.apk" \
    && /usr/glibc-compat/bin/localedef -i ja_JP -f UTF-8 ja_JP.UTF-8 \
    && apk del --purge .build-deps \
    && apk add --no-cache ca-certificates openssl

ENV JAVA_VERSION 8.0.7.20

RUN set -eux; \
    YML_FILE='jre/linux/x86_64/index.yml'; \
    BASE_URL="https://public.dhe.ibm.com/ibmdl/export/pub/systems/cloud/runtimes/java/meta/8.0/"; \
    wget -q -U UA_IBM_JAVA_Docker -O /tmp/index.yml ${BASE_URL}/${YML_FILE}; \
    JAVA_URL=$(sed -n '/^'${JAVA_VERSION}:'/{n;s/\s*uri:\s//p}'< /tmp/index.yml); \
    wget -q -U UA_IBM_JAVA_Docker -O /tmp/ibm-java.bin ${JAVA_URL}; \
    echo "INSTALLER_UI=silent" > /tmp/response.properties; \
    echo "USER_INSTALL_DIR=/opt/ibm/java" >> /tmp/response.properties; \
    echo "LICENSE_ACCEPTED=TRUE" >> /tmp/response.properties; \
    mkdir -p /opt/ibm; \
    chmod +x /tmp/ibm-java.bin; \
    /tmp/ibm-java.bin -i silent -f /tmp/response.properties; \
    rm -f /tmp/response.properties /tmp/index.yml /tmp/ibm-java.bin

# Install WebSphere Liberty
ENV LIBERTY_VERSION 22.0.0.12

ARG LIBERTY_URL 
ARG DOWNLOAD_OPTIONS=""

RUN LIBERTY_URL=${LIBERTY_URL:-$(wget -q -O - https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/index.yml  | grep $LIBERTY_VERSION -A 6 | sed -n 's/\s*kernel:\s//p' | tr -d '\r' | head -1 )}  \
    && wget -q $DOWNLOAD_OPTIONS $LIBERTY_URL -U UA-IBM-WebSphere-Liberty-Docker -O /tmp/wlp.zip \
    && unzip -q /tmp/wlp.zip -d /opt/ibm \
    && rm /tmp/wlp.zip

ENV JAVA_HOME=/opt/ibm/java/jre \
    PATH=/opt/ibm/java/jre/bin:/opt/ibm/wlp/bin:$PATH \
    IBM_JAVA_OPTIONS="-XX:+UseContainerSupport" \
    LANG=ja_JP.UTF-8 LANGUAGE=ja_JP.UTF-8

RUN /opt/ibm/wlp/bin/server create
RUN /opt/ibm/wlp/bin/installUtility install defaultServer

EXPOSE 9080 9443

CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]
```
# 起動メッセージ
起動すると以下のメッセージが出力されました。

```
IBM J9 VM バージョン 8.0.7.20 - pxa6480sr7fp20-20221020_01(SR7 FP20) (ja_JP) で、defaultServer (WebSphere Application Server 22.0.0.12/wlp-1.0.71.cl221220221107-1900) を起動 しています
[AUDIT   ] CWWKE0001I: サーバー defaultServer が起動されました。
[AUDIT   ] CWWKE0100I: この製品は、開発使用向け、および限定的な実動使用向けにライセンスが交付されています。 全ライセンス条項は以下で表示可能です: https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/base_ilan/ilan/22.0.0.12/lafiles/ja.html
[警告      ] CWWKF0009W: サーバーは、いずれのフィーチャーもインストールするようには構成されていません。
[AUDIT   ] CWWKF0011I: defaultServer サーバーは、Smarter Planet に対応する準備ができま
した。defaultServer サーバーは 3.164 秒で始動しました。
```
# 特徴
・Alpineをベースにしていて、scratchから構築している。
・日本語化している。
・2022/11/23現在の最新版IBM JRE、Libertyを使用している。
・/opt/ibm/wlp/bin/clientなども動かしたいので、/configなどのリンクは使わない。

[index.yml](https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/index.yml)が更新されています。更新されてない場合、index.ymlからパスを取得するのではなく、直接ダウンロードしたものを使うようにしましょう。

```
https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/22.0.0.4/wlp-kernel-22.0.0.4.zip
```
# おまけ
minirootfsは
[aports](https://github.com/alpinelinux/aports)
のscripts/genrootfs.shを使えば、簡単にできます。
main/busybox配下でbusybox-1.30.1を作成後、それを使ってみます。

```
./genrootfs.sh -o test-x86_64.tar.gz busybox-1.30.1-r1.apk \
    ssl_client-1.30.1-r1.apk \
    alpine-baselayout alpine-keys apk-tools libc-utils
```

8/26時点で[alpine:latestのDockerfile](https://github.com/alpinelinux/docker-alpine/blob/c13cf91002136261e690adacd43a8fd6b929b4c8/x86_64/Dockerfile)は以下でした。

```
FROM scratch
ADD alpine-minirootfs-3.10.2-x86_64.tar.gz /
CMD ["/bin/sh"]
```
# 参考リンク
[How_to_make_a_custom_ISO_image_with_mkimage](https://wiki.alpinelinux.org/wiki/How_to_make_a_custom_ISO_image_with_mkimage)
[Alpine Linux用パッケージを作成する](https://qiita.com/SKAhack/items/0d2146305f569f09b96a)

チェックしたいサイトは以下です。
・IBM JRE
https://public.dhe.ibm.com/ibmdl/export/pub/systems/cloud/runtimes/java/meta/jre/linux/x86_64/index.yml
・Liberty
https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/index.yml

Libertyのリリース予定は
[Recommended updates for WebSphere Application Server](https://www-01.ibm.com/support/docview.wss?uid=swg27004980)にありますが、あくまで予定なので実際に早まることが多いです。
## 変更履歴
(2019/6/22) rootfsを3.9.3から3.10.0に変更、Libertyを19.0.0_06に変更
(2019/6/27) keytoolが以下のエラーになるので、ホスト名変更を追加
デフォルトの SSL 証明書を作成できません。
keytool エラー (英語の場合があります): java.lang.RuntimeException: java.io.IOException: Invalid IPAddressName 992fdba70de5
(2019/7/11)jreを1.8.0_sr5fp37に変更。server.xml、earのコピーを削除。ホスト名の設定部分を削除。
(2019/7/24)[index.yml](https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/index.yml)に無いバージョンの対処を追加。19.0.0.7など。
(2019/8/1x?)[index.yml]https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/downloads/wlp/index.yml)が更新されていましたので、ベースのLibertyを19.0.0.7に変更。
(2019/8/21)JREを1.8.0_sr5fp40に、Libertyを19.0.0.8にバージョンアップ。
(2019/8/26)alpine linuxのバージョンを3.10.2に変更。ALPINE_GLIBCのバージョンを2.30に変更。
(2019/9/15)Libertyを19.0.0.9にバージョンアップ。
(2019/9/29)jreの8.0.5.41について追記。
(2019/10/11)Libertyの19.0.0.10がリリースされた。index.yamlも更新されています。
(2019/10/22)Liberty-19.0.0.10に更新しきれなかった部分を修正。
(2019/10/23)Alpineのrootfsを3.10.3に更新。
(2019/11/13)Libertyを19.0.0.11にバージョンアップ。
(2020/3/6)Libertyを20.0.0.2に、Alpineのrootfsを3.11.3に、jreを8.0.6.5にバージョンアップ。
(2020/3/24)Libertyを20.0.0.3に、Alpineのrootfsを3.11.5にバージョンアップ。
(2020/4/12)Libertyを20.0.0.4に、jreを8.0.6.7にバージョンアップ。ただし、Libertyはindex.ymlにまだないです。
(2020/4/15)Liberty-20.0.0.4がindex.ymlに入ったので修正。Libertyのバージョン指定を修正。
(2020/5/8)Libertyを20.0.0.5に、jreを8.0.6.10にバージョンアップ。
修正。Libertyのバージョン指定を修正。
(2020/5/23)alpline linuxを3.11.6にバージョンアップ、websphere-libertyの状況を更新。
(2020/6/12)alpline linuxを3.12.0に、Libertyを20.0.0.6にバージョンアップ。
(2020/6/27)jreを8.0.6.11にバージョンアップ。
(2020/7/8)Libertyを20.0.0.7にバージョンアップ。
(2020/8/5)Libertyを20.0.0.8にバージョンアップ。
(2020/9/13)Libertyを20.0.0.9に、jreを8.0.6.15にバージョンアップ。
(2020/9/30)Libertyを20.0.0.10に、jreを8.0.6.16にバージョンアップ。
(2020/12/11)Libertyを20.0.0.12にバージョンアップ。
(2020/12/11)jreを8.0.6.20にバージョンアップ。
(2021/02/19)Libertyを21.0.0.2にバージョンアップ。
(2021/03/15)jreを8.0.6.26にバージョンアップ。
(2021/03/22)Libertyを21.0.0.3にバージョンアップ。
(2021/03/31)alpline linuxを3.13.3にバージョンアップ。
(2021/05/05)alpline linuxを3.13.5にバージョンアップ。Libertyを21.0.0.4にバージョンアップ。
(2021/05/31)Libertyを21.0.0.5に、jreを8.0.6.30にバージョンアップ。
(2021/07/26)alpline linuxを3.14.0に、Libertyを21.0.0.7に、jreを8.0.6.31にバージョンアップ。
(2021/08/21)alpline linuxを3.14.1に、Libertyを21.0.0.8にバージョンアップ
(2021/09/17)alpline linuxを3.14.2に、Libertyを21.0.0.9に、jreを8.0.6.36にバージョンアップ。
(2021/12/19)alpline linuxを3.15.0に、Libertyを21.0.0.12に、jreを8.0.7.0にバージョンアップ。
(2022/01/01)GNU C Libraryの取得方法を変更。busyboxのバージョンを1.34.1
(2022/01/18)Libertyを22.0.0.1にバージョンアップ。
(2022/02/15)Libertyを22.0.0.2にバージョンアップ。
(2022/03/10)jreを8.0.7.5にバージョンアップ。
(2022/03/26)Libertyを22.0.0.3に、alpline linuxを3.15.2にバージョンアップ。
(2022/04/01)alpline linuxを3.15.3にバージョンアップ。
(2022/04/22)Libertyを22.0.0.4に、alpline linuxを3.15.4にバージョンアップ。
(2022/04/30)jreを8.0.7.6にバージョンアップ。
(2022/05/28)Libertyを22.0.0.5に、alpline linuxを3.16.0にバージョンアップ。
(2022/06/12)Libertyを22.0.0.6にバージョンアップ。
(2022/07/13)Libertyを22.0.0.7にバージョンアップ。
(2022/07/13)jreを8.0.7.11にバージョンアップ。
(2022/07/14)起動メッセージ張り直し。
(2022/08/04)Libertyを22.0.0.8に、alpline linuxを3.16.1にバージョンアップ。busybox関連は別記事に移動しました。
(2022/08/31)Libertyを22.0.0.9に、alpline linuxを3.16.2にバージョンアップ。
(2022/09/21)jreを8.0.7.11にバージョンアップ。
(2022/10/29)jreを8.0.7.15に、Libertyを22.0.0.11にバージョンアップ。Libertyのindex.ymlからの検索を修正。
(2022/11/23)jreを8.0.7.20に、Libertyを22.0.0.12にバージョンアップ。