debian:stable-slim に adoptopenjdk-8-hotspot をインストールすると postinst スクリプトが失敗する

そもそもの話

AdoptOpenJDK は各種OS(ディストリビューション)向けのインストーラーを提供してる。

medium.com

DebianUbuntu のように APT を使ってるなら adoptopenjdk-8-hotspot みたいなパッケージとして導入できる。

できなかった話とできるようにした話

  • debian:stable-slim では openjdk-8-headless が無くなってたので adoptopenjdk-8-hotspot をインストールしようと試みた
  • adoptopenjdk-8-hotspotpostinst スクリプトが実行時エラーになるため、 docker image のビルドが完了できない
    • /usr/share/man/man1 が存在しないから update-alternatives に失敗するとかその程度の問題だった
  • /usr/share/man/man1 を作成すれば以降の対応はすべて不要
  • RUN 命令に指定した apt-get install の結果を無視する方法を模索
    • パイプで右辺評価させてもだめ apt-get install adoptopenjdk-8-hotspot || true
    • サブシェルで評価させてもだめ ( apt-get install adoptopenjdk-8-hotspot; echo )
  • らちが明かないので .deb ファイルを改変して対応
    • dpkg-deb を駆使するといろいろできる
    • 該当部分をごまかした postinst.sh に差し替えた .deb ファイルを作成
  • そういえば maven も必要だったけど同じように postinst スクリプトが失敗する
  • やっぱり同じように .deb ファイルを改変して対応

結果的にこういう Dockerfile になった。よくない。

たぶん sdkman を利用するのが一番早いと思います。

FROM debian:stable-slim

ENV DEBIAN_FRONTEND=noninteractive
ENV LANG="ja_JP.UTF-8"

RUN set -x \
 && apt-get update --quiet \
 && apt-get upgrade --quiet --yes \
 && apt-get autoremove --quiet --yes \
 && apt-get clean \
 && rm -rf /var/cache/* /var/tmp/* /var/lib/apt/lists/*

RUN set -x \
 && apt-get update --quiet \
 && apt-get install --quiet --no-install-recommends --no-install-suggests --yes \
    curl \
    gnupg \
    locales \
    software-properties-common \
    unzip \
    zip \
 && apt-get autoremove --quiet --yes \
 && apt-get clean \
 && rm -rf /var/cache/* /var/tmp/* /var/lib/apt/lists/*

RUN set -x \
 && sed -i -e "s/^#.*${LANG} UTF-8/${LANG} UTF-8/" /etc/locale.gen \
 && dpkg-reconfigure locales \
 && update-locale LANG="${LANG}" \

RUN set -x \
 && curl -fsSL --output /var/tmp/key https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public \
 && apt-key add /var/tmp/key \
 && add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/ \
 && apt-get update --quiet \
 && apt-get install --quiet --no-install-recommends --no-install-suggests --yes \
    java-common \
    libasound2 \
    libjansi-java \
    libmaven3-core-java \
    libwagon-file-java \
    libwagon-http-shaded-java \
    libxrender1 \
    libxtst6 \
 && apt-get autoremove --quiet --yes \
 && apt-get clean \
 && rm -rf /var/cache/* /var/tmp/* /var/lib/apt/lists/*

RUN { \
        echo '#!/bin/sh'; \
        echo ''; \
        echo 'set -eu'; \
        echo ''; \
        echo 'priority=1081'; \
        echo 'jdk_base_dir=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64'; \
        echo 'tools="appletviewer extcheck idlj jar jarsigner java javac javadoc javah javap jcmd jconsole jdb jdeps jhat jinfo jjs jmap jps jrunscript jsadebugd jstack jstat jstatd keytool native2ascii orbd pack200 policytool rmic rmid rmiregistry schemagen serialver servertool tnameserv unpack200 wsgen wsimport xjc jexec"'; \
        echo ''; \
        echo 'case "$1" in'; \
        echo 'configure)'; \
        echo '    for tool in $tools ; do'; \
        echo '        for tool_path in "$jdk_base_dir/bin/$tool" "$jdk_base_dir/lib/$tool" ; do'; \
        echo '            if [ ! -e "$tool_path" ]; then'; \
        echo '                continue'; \
        echo '            fi'; \
        echo ''; \
        echo '            slave=""'; \
        echo '            tool_man_path="$jdk_base_dir/man/man1/$tool.1"'; \
        echo '            if [ -e "$tool_man_path" ]; then'; \
        echo '                mkdir -p /usr/share/man/man1'; \
        echo '                slave="--slave /usr/share/man/man1/$tool.1 $tool.1 $tool_man_path"'; \
        echo '            fi'; \
        echo ''; \
        echo '            update-alternatives \\'; \
        echo '                --install \\'; \
        echo '                "/usr/bin/$tool" \\'; \
        echo '                "$tool" \\'; \
        echo '                "$tool_path" \\'; \
        echo '                "$priority" \\'; \
        echo '                $slave'; \
        echo '        done'; \
        echo '    done'; \
        echo ';;'; \
        echo 'esac'; \
    } > /var/tmp/adoptopenjdk-8-hotspot.postinst

RUN set -x \
 && cd /var/tmp \
 && apt-get update --quiet \
 && apt-get download adoptopenjdk-8-hotspot \
 && mkdir src \
 && dpkg-deb -R adoptopenjdk-8-hotspot*.deb src \
 && mv /var/tmp/adoptopenjdk-8-hotspot.postinst src/DEBIAN/postinst \
 && chmod 755 src/DEBIAN/postinst \
 && dpkg-deb -b src new.deb \
 && dpkg --install new.deb \
 && cd / \
 && apt-get autoremove --quiet --yes \
 && apt-get clean \
 && rm -rf /var/cache/* /var/tmp/* /var/lib/apt/lists/*

RUN { \
        echo '#!/bin/sh'; \
        echo ''; \
        echo 'set -e'; \
        echo ''; \
        echo 'basedir=/usr/share/maven'; \
        echo 'priority=300'; \
        echo ''; \
        echo 'case "$1" in'; \
        echo 'configure)'; \
        echo ''; \
        echo '    update-alternatives \\'; \
        echo '    --install /usr/bin/mvn mvn $basedir/bin/mvn $priority \\'; \
        echo '    --slave \\'; \
        echo '        /usr/bin/mvnDebug \\'; \
        echo '        mvnDebug \\'; \
        echo '        $basedir/bin/mvnDebug \\'; \
        echo '    ;;'; \
        echo 'esac'; \
        echo ''; \
        echo 'exit 0'; \
    } > /var/tmp/maven.postinst

RUN set -x \
 && cd /var/tmp \
 && apt-get update --quiet \
 && apt-get download maven \
 && mkdir src \
 && dpkg-deb -R maven*.deb src \
 && mv /var/tmp/maven.postinst src/DEBIAN/postinst \
 && chmod 755 src/DEBIAN/postinst \
 && dpkg-deb -b src new.deb \
 && dpkg --install new.deb \
 && cd / \
 && apt-get autoremove --quiet --yes \
 && apt-get clean \
 && rm -rf /var/cache/* /var/tmp/* /var/lib/apt/lists/*

RUN java -version \
 && mvn -version

ENTRYPOINT ["mvn"]
CMD ["test"]

オンラインリソース