Dockerfileを書いていて【apt】と【apt-get】【apt-cache】の使い分けに悩んだ話
僕の普段使うLinuxのディストリビューションはUbuntuです。
Ubuntuではかなり前から古いapt-getではなく新しいaptが推奨されているため、今では当然のようにaptを使っています。
aptはapt-getとapt-cacheが統合されたようなコマンドなので、こっちのほうが便利ですしね。
旧(apt-get,apt-cache,dpkg)と新(apt)の対応例
旧 | 新 | 機能 |
---|---|---|
apt-get update | apt update | 設定されたすべての取得元からパッケージ情報をダウンロードする |
apt-get upgrade | apt upgrade | 設定された取得元からシステムに現在インストール済みのすべてのパッケージで利用可能なアップグレードをインストールする |
apt-get dist-upgrade | apt full-upgrade | upgradeではパッケージを更新するために他のパッケージを削除する必要があるときは保留されるが、こちらはパッケージを削除しないと更新できないパッケージも更新対象となる |
apt-get install パッケージ | apt install パッケージ | パッケージをインストールする |
apt-get remove パッケージ | apt remove パッケージ | パッケージを削除する |
apt-get autoremove | apt autoremove | パッケージを削除したために必要なくなったパッケージを削除する |
apt-cache search 文字列 | apt search 文字列 | 指定した文字列を含むパッケージを検索する |
apt-cache show パッケージ | apt show パッケージ | 指定されたパッケージに関する情報を表示する |
dpkg --list パッケージ apt-cache -n search | apt list パッケージ | パッケージを検索する |
しかし、Dockerfileを触っていると、apt-getを使っているものが多いです。
なんでだろう?aptが推奨じゃないの?と思っていましたが、aptのマニュアルを見るとこう書かれていました。
スクリプトの使い方およびほかの APT ツールとの違い
apt(8) コマンドラインはエンドユーザ向けツールとして設計されています。動作はバージョン間で変更される可能性があ
ります。後方互換性を損なうことのないようには努めますが、変更がインタラクティブな使用に有益と思われる場合に
は、その保証はありません。
apt(8) のすべての機能は、apt-get(8) や apt-cache(8) など専用の APT ツールで利用可能です。apt(8) は、単にいくつ
かのオプションのデフォルト値を変更します (apt.conf(5) の特にバイナリ範囲を参照)。可能な限り下位互換性を保つよ
うに、スクリプトでは (潜在的に有効になっているいくつかの追加オプションをつけて) コマンドを使うべきです。
つまり、コマンドラインで打つときはaptを使いますが、スクリプトで使うときは下位互換性を保ってapt-getやapt-cacheを使うのが推奨されているようです。
なるほど、勉強になりました。