dockerイメージのパッケージ管理

Dockerのイメージ作成・管理では多くの場合、ベースイメージとしてDockerHubのオフィシャルイメージを起点とします。
公式イメージの大半がDebianまたはAlpine Linuxであるため、DebianとAlpineのパッケージ管理を理解することで、dockerイメージのインストール作業をスムーズに進められます。

Debian

Debianのパッケージマネージャーはaptです。インストールコマンドとしてはapt-getを利用します。

最新リポジトリのパッケージリスト取得はapt-get updateです。
ベースイメージなどでパッケージリストをクリアしているものも多いため、apt-get updateしないとインストールできない場合があります。

パッケージのインストールはapt-get installです。
Dockerのイメージビルド向けには

apt-get install -y --no-install-recommends

の形式が使えます。

-yオプションは対話コマンドの事前承諾で、これを付けないと自動実行が完結しません。
--no-install-recommendsは関連推奨パッケージをインストールしないオプションで容量を低減できます。オプション無指定時のデフォルトでは、recommendsパッケージはインストールされます。

その他のオプションなどについては、 apt-getの公式manページを参照してください。

対話シェルのスキップ・自動化

aptでインストールする際、インストールオプションを選択するためコンソール入力待ちになるパッケージがあります。
yes/noで選択するパッケージでyes回答で問題なければ、apt-get -yオプションを指定すると自動で進められます。

まれに、選択肢がyes/noではなくデフォルトのない対話入力を要求するパッケージもあります。
DEBIAN_FRONTEND=nointeractive apt-getのように環境変数DEBIAN_FRONTENDを指定しておくと、入力待ちにならずに進むケースがあります。
ただし、選択をスキップしているため、どのようなインストール結果になるかは、各パッケージごとに異なり、適切に動作しない可能性は残ります。

Alpine Linux

Alpine Linuxのパッケージマネージャーはapkコマンドです。
最新リポジトリのパッケージリスト取得はapk updateです。

/opt/certbot # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz
v3.4.6-269-g58be72f [http://dl-cdn.alpinelinux.org/alpine/v3.4/main]
v3.4.6-160-g14ad2a3 [http://dl-cdn.alpinelinux.org/alpine/v3.4/community]
OK: 5978 distinct packages available

パッケージのインストールコマンドはapk addコマンドです。
Dockerイメージ向けには、--no-cacheオプションでインストール時の中間ファイルを削除できます。

/opt/certbot # apk add git
(1/3) Installing libcurl (7.58.0-r0)
(2/3) Installing pcre (8.38-r1)
(3/3) Installing git (2.8.6-r0)
Executing busybox-1.24.2-r14.trigger
OK: 57 MiB in 40 packages

このケースでは依存パッケージを含めて3つインストールし、合計で40パッケージわずか57MiBという結果が表示されています。
その他のオプションについては、 apkコマンドの公式リファレンスを参照してください。

一般的なパッケージマネージャと同様の機能が揃っていますが、Dockerイメージはゼロからインストールすることが多いため、updateとaddでほぼ足りるでしょう。

Alpine Linuxの注意点

直接パッケージ管理の話題ではないのですが、Alipine Linuxは軽量化のためbashではなく/bin/sh(実態はbusybox)を採用している点には注意が必要です。
DockerではシェルスクリプトやCMDの指定にシェルのPATHを意識する場合があります。

docker execでコンテナに入る場合にもshを指定する必要があります。
bashではないもののTAB補完も効きますし、必要に応じてapk add vimも可能なためOS管理操作がDebianより著しく制約されるという感覚はありません。

中馬崇尋
Chuma Takahiro