Debian10のslimイメージでJDKがインストールできないときにすること

## はじめに

DockerでDebian10-slimをベースイメージにするとJDK(Javaの開発キット)がインストールできなかったのでいろいろ調べました。

## 先に結論

JDKインストール前に `mkdir -p /usr/share/man/man1` を実行する([参考スレッド](https://github.com/geerlingguy/ansible-role-java/issues/64#issuecomment-393299088))。

```
# これを先に行う
$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`をインストールしようとしても結果は同じ。

### ひたすらググってみる

検索していると[冒頭に紹介したスレッド](https://github.com/geerlingguy/ansible-role-java/issues/64#issuecomment-393299088)にたどりつきました。

> 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の整備がされていないとのこと([参考](https://github.com/tianon/docker-brew-debian/issues/65#issuecomment-305910851))。

```
# 一応 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](https://github.com/balena-io-library/base-images/pull/276)
[ekino/docker-buildbox](https://github.com/ekino/docker-buildbox/pull/170)
[mozilla-platform-ops/relops-hardware-controller](https://github.com/mozilla-platform-ops/relops-hardware-controller/pull/21)
[geerlingguy/ansible-role-java](https://github.com/geerlingguy/ansible-role-java/commit/ee7c12b13aa594dc747892860e563f45794e94d0)

## おわりに

解決策としてはあっさりしてますが、けっこう時間かかりました・・・(なかなかググってもでなかった)。
参考になればうれしいです。