はじめに
docker の debian:buster で apt install openjdk-11-jre-headless
等とやっても失敗します。なぜ?
調べました。
結論
原因と現象
debian:buster も image サイズ削減のため man page インストールを回避する設定が成されている。
ただし、この設定は Alternatives System をカバーするには不十分で、openjdk-11 の postinst スクリプトがエラー終了してしまい、apt install も失敗する。
対処
openjdk-11 専用に man page インストール回避の設定を加えると、無事にインストールが完了する。
詳細
man page インストール回避の設定
dpkg への指示により実現されています。
(略)
path-exclude /usr/share/man/*
(略)
結果 /usr/share/man/man1 などが作成されません。
openjdk-11-jre-headless の実ファイルの所在
Alternatives System がリンクを張る java
コマンドや man page などの実体は /usr/lib/jvm/java-11-openjdk-amd64 にあります。
(略)
basedir=/usr/lib/jvm/java-11-openjdk-amd64
mandir=$basedir/man
(略)
update-alternatives コマンドの失敗
上述の postinst スクリプトは、もし所定のディレクトリに man page が存在したら update-alternatives
に処理させる、という仕組みになっています。ただし、前述の設定で /usr/share/man/man1 などが存在していないため、リンクを張る処理が失敗します。
なので、dpkg への指示で openjdk-11 の man page も存在させないようにしてしまえば、リンクを張る処理が実施されず失敗もしない、ということになります。
Dockerfile 例
都合、下記のようにすれば、openjdk-11-jre-headless をインストールした debian:buster ベースのイメージが作成できます。
FROM debian:10.10-slim
RUN echo "path-exclude /usr/lib/jvm/java-11-openjdk-amd64/man/*" > /etc/dpkg/dpkg.cfg.d/openjdk-11 && \
apt update && \
apt -y install --no-install-recommends openjdk-11-jre-headless
おわりに
centos:centos7 で /usr/share/doc が空っぽなのは、/etc/yum.conf に nodocs 指示が書かれているから、でした。yum への設定なので、直接 rpm コマンドを利用すればこの設定の影響は回避されます。
他方 debian は dpkg への設定なので、apt を利用した場合も同じ結果になります。
このあたり、思想の違いが感じられて、面白いです。