Dockerコンテナ環境でmanコマンドを使えない問題を解決する方法

はじめに

飽きずに毎日Bashやシェルスクリプト関連の記事を書いているわけですが、 記事の内容が本当に正しいのかを確認するためにDockerコンテナ環境内で動作を確認しています。

僕のMac環境は随分汚れてしまっているので、正しい動作を確認するためにはクリーンな環境が必要なわけです。

執筆の合間にBashの正しい挙動はどう定義されているのかを書くにするために man コマンドを実行したくなることもあるのですが、Dockerコンテナ内で man bash を実行してもマニュアルが確認できません。

コンテナイメージのサイズが大きくなってしまいますが、事前にインストールしておこうと思いました。

検証環境

いつも執筆の際に利用しているディストリビューションは CentOS です。 ( 未だにCentOS なので、いい加減Ubuntuあたりに移行したい。 ) 大体 docker run --rm -it centos:centos7 bash を実行して、検証環境を立ち上げています。

1
2
3
4
5
6
7
8
$ cat /etc/os-release | head -n 1
NAME="CentOS Linux"

$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

man コマンドをインストールしてはみるが…

CentOSのパッケージ管理ツールといえば YUM です。 yum コマンドで man をインストールします。

1
2
3
4
$ yum install man -y

$ type man
man is /usr/bin/man

正しくインストールされたのを確認し、次のステップへ。

1
2
$ man bash
No manual entry for bash

Bashのmanページデータがインストールされていないようなので、Bashを再インストールします。 (インストールしなおせば、man情報を含んでインストールされるはずです。)

1
$ yum reinstall -y bash

manページデータがインストールされたはずなので再度Bashのマニュアルを確認してみます。

1
2
$ man bash
No manual entry for bash

何故かマニュアルが引けません。

Dockerコンテナ内のYUMはマニュアルをインストールしない

原因はYUMの設定です。

/etc/yum.conf を覗いてみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 先頭15行を表示
$ cat /etc/yum.conf | head -n 15
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
override_install_langs=en_US.utf8
tsflags=nodocs

一番下の設定である tsflags=nodocs が原因です。 nodocs とあるように、このフラグが設定されていることでmanページデータがインストールされません。

これに対処する方法は2つあります。

対処法1: /etc/yum.conf ファイルを書き換える

原因は /etc/yum.conf ファイルなので、該当箇所をコメントして無効化します。

1
2
3
4
$ sed 's/^tsflags=/#\0/' -i /etc/yum.conf

$ cat /etc/yum.conf | grep 'tsflags'
#tsflags=nodocs

無効化したあとは、Bashを再インストールします。

1
$ yum reinstall -y bash

マニュアルを確認してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ man bash | head -n 15
BASH(1)                                                              General Commands Manual                                                              BASH(1)



NAME
       bash - GNU Bourne-Again SHell

SYNOPSIS
       bash [options] [file]

COPYRIGHT
       Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.

DESCRIPTION
       Bash  is  an sh-compatible command language interpreter that executes commands read from the standard input or from a file.  Bash also incorporates useful

対処法2: 一時的に nodocs を無効化するオプションを付けてインストールする

yum コマンドのコマンドライン引数で一時的に /etc/yum.conf の任意のオプションを上書きしてやることができます。

1
2
$ yum install -y man
$ yum reinstall --setopt=tsflags='' -y bash

マニュアルを確認してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ man bash | head -n 15
BASH(1)                                                              General Commands Manual                                                              BASH(1)



NAME
       bash - GNU Bourne-Again SHell

SYNOPSIS
       bash [options] [file]

COPYRIGHT
       Bash is Copyright (C) 1989-2011 by the Free Software Foundation, Inc.

DESCRIPTION
       Bash  is  an sh-compatible command language interpreter that executes commands read from the standard input or from a file.  Bash also incorporates useful

ひとこと

Dockerコンテナ内にmanページがインストールされないようになっているのは、配布を目的としたDockerイメージを軽量化するための設定としては正しいと言えます。 ただ、僕のようにUnixコマンドの学習環境としてDockerを利用している場合にはmanページがインストールされていると非常に便利です。