debian:stable-slim に adoptopenjdk-8-hotspot をインストールすると postinst スクリプトが失敗する
そもそもの話
AdoptOpenJDK は各種OS(ディストリビューション)向けのインストーラーを提供してる。
Debian や Ubuntu のように APT を使ってるなら adoptopenjdk-8-hotspot
みたいなパッケージとして導入できる。
できなかった話とできるようにした話
debian:stable-slim
ではopenjdk-8-headless
が無くなってたのでadoptopenjdk-8-hotspot
をインストールしようと試みたdebian:stable-slim
はdebian:buster-slim
(10) に相当するイメージ- パッケージ検索結果 openjdk-8-headless
stretch(oldstable)
とsid(unstable)
には存在するけどbuster(stable)
には存在しない
adoptopenjdk-8-hotspot
のpostinst
スクリプトが実行時エラーになるため、 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"]
オンラインリソース
- openjdk-installer
- is:issue is:open Debian
- キーワード Debian がヒットする未解決課題
- 報告しようと思ったけど
ca-certificates-java
の依存性に関する問題を見て心変わりした - ディストリビューションの作法と衝突する部分は難しいよね…
- dpkg-deb