はじめに
DockerでDebian10-slimをベースイメージにするとJDK(Javaの開発キット)がインストールできなかったのでいろいろ調べました。
先に結論
JDKインストール前に mkdir -p /usr/share/man/man1
を実行する(参考スレッド)。
# これを先に行う
$mkdir -p /usr/share/man/man1
$apt install default-jdk
調べてみた
環境情報
開発環境やイメージ情報
開発機OS: macOS Big Sur 11.2
Docker: 20.10.2
ベースイメージ: debian:buster-slim
Debianバージョン: 10.8(buster)
まずはいつも通りインストールしてみる
が、見事に失敗。
# aptの更新
$apt -y update
$apt -y upgrade
# パッケージの検索
$apt search jdk
---検索結果---
...
default-jdk/stable 2:1.11-71 amd64
Standard Java or Java compatible Development Kit
...
-------------
# インストール
$apt install default-jdk
---実行結果---
...
dpkg: dependency problems prevent configuration of default-jdk:
default-jdk depends on default-jre (= 2:1.11-71); however:
Package default-jre is not configured yet.
default-jdk depends on default-jdk-headless (= 2:1.11-71); however:
Package default-jdk-headless is not configured yet.
default-jdk depends on openjdk-11-jdk; however:
Package openjdk-11-jdk:amd64 is not configured yet.
dpkg: error processing package default-jdk (--configure):
dependency problems - leaving unconfigured
Processing triggers for systemd (241-7~deb10u6) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for ca-certificates (20200601~deb10u2) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
done.
Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
Errors were encountered while processing:
openjdk-11-jre-headless:amd64
openjdk-11-jre:amd64
openjdk-11-jdk-headless:amd64
default-jre
default-jdk-headless
openjdk-11-jdk:amd64
default-jdk
E: Sub-process /usr/bin/dpkg returned an error code (1)
----------
$java --version
bash: java: command not found
dependency problemsってのはわかったが、具体的に何がダメなのかがわからない。
ちなみに、openjdk-11-jdk
をインストールしようとしても結果は同じ。
ひたすらググってみる
検索していると冒頭に紹介したスレッドにたどりつきました。
See: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199#23
I had the same issue and solved it using
mkdir -p /usr/share/man/man1
before installing openjdk-8-jre-headless
というわけで早速実行しますと、成功します!
$apt -y update
$apt -y upgrade
$mkdir -p /usr/share/man/man1
$apt install default-jdk
---実行結果---
...
Setting up default-jdk (2:1.11-71) ...
Processing triggers for systemd (241-7~deb10u6) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for ca-certificates (20200601~deb10u2) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
done.
Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
------------
$java --version
openjdk 11.0.9.1 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-post-Debian-1deb10u2)
OpenJDK 64-Bit Server VM (build 11.0.9.1+1-post-Debian-1deb10u2, mixed mode, sharing)
軽く考察
man?
manはコマンドのレファレンスマニュアルを表示するためのコマンドです。
今回ベースイメージとしてdebian:buster-slim
を使用したんですが、slimイメージはベースイメージの軽量化を目的としているため、このmanの整備がされていないとのこと(参考)。
# 一応 manのディレクトリはあるみたい・・・
# でも中身はない
$ls /usr/local/ | grep man
man
$ls /usr/local/man/
# 何もない
$ls /usr/share/ | grep man
man
$ls /usr/share/man/
# やっぱり何にもない
となると、manを入れてあげればいいのでは?となるのですが、インストールしてもやっぱり上手くいかない・・・。
$apt install man-db
$which man
/usr/bin/man # ちゃんとインストールされたっぽい
$apt install default-jdk
---実行結果---
dpkg: dependency problems prevent configuration of default-jdk:
default-jdk depends on default-jre (= 2:1.11-71); however:
Package default-jre is not configured yet.
default-jdk depends on default-jdk-headless (= 2:1.11-71); however:
Package default-jdk-headless is not configured yet.
default-jdk depends on openjdk-11-jdk; however:
Package openjdk-11-jdk:amd64 is not configured yet.
dpkg: error processing package default-jdk (--configure):
dependency problems - leaving unconfigured
Processing triggers for systemd (241-7~deb10u6) ...
Processing triggers for man-db (2.8.5-2) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for ca-certificates (20200601~deb10u2) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
done.
Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) ...
Errors were encountered while processing:
openjdk-11-jre-headless:amd64
openjdk-11-jre:amd64
openjdk-11-jdk-headless:amd64
default-jre
default-jdk-headless
openjdk-11-jdk:amd64
default-jdk
E: Sub-process /usr/bin/dpkg returned an error code (1)
------------
$ls /usr/local/ | grep man
man
$ls /usr/local/man/
# 作成されてない
$ls /usr/share/ | grep man
man
$ls /usr/share/man/
# やっぱり作成されてない
ディレクトリを直接作成するだけで大丈夫なの?
検証しておりませんが、いくつかのプロジェクトの対応策としてもmkdir -p /usr/share/man/man1
の対策がとられているので、おそらく大丈夫ではないかと考えてます。
balena-io-library/base-images
ekino/docker-buildbox
mozilla-platform-ops/relops-hardware-controller
geerlingguy/ansible-role-java
おわりに
解決策としてはあっさりしてますが、けっこう時間かかりました・・・(なかなかググってもでなかった)。
参考になればうれしいです。