LoginSignup
0
1

More than 1 year has passed since last update.

[2021Sep] docker の debian:buster に openjdk をインストールする

Posted at

はじめに

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 への指示により実現されています。

/etc/dpkg/dpkg.cfg.d/docker
(略)
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 にあります。

/var/lib/dpkg/info/openjdk-11-jre-headless:amd64.postinst
(略)
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 ベースのイメージが作成できます。

Dockerfile
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 を利用した場合も同じ結果になります。

このあたり、思想の違いが感じられて、面白いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1