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