コマンドapt-get updateが何をするのか、いつそれを使うべきなのかを説明できますか
apt-get update
ディストリビューションのパッケージリポジトリから更新されたインデックスをダウンロードし、利用可能なすべてのパッケージとその正確なバージョンを一覧表示します。
UbuntuやDebianのような一般的なディストリビューションは、通常、パッケージ製品で保守的で下位互換性があるため、バージョンは時間とともにあまり変化しません。セキュリティの更新またはバグ修正により変更されます。たとえば、mysqlは5.7.18
to からアップグレードできますが、to にはアップグレードでき5.7.19
ません6.x
。
パッケージインデックスはどこに保存されますか?データベース上?ファイルに?
通常、内の1つ以上のファイルに保存されます/var/lib/apt
。Dockerのコンテキストでは、これらのファイルはイメージ内にあります。Dockerfileをビルドすると、ファイルシステムの新しいレイヤーに保存され、新しくビルドされたイメージとして作成および保持されます。
キャッシュを更新せずにapt-getをインストールするとどうなりますか?
もう存在しないパッケージバージョンをダウンロードしようとする場合があります。これは仮想マシンでは非常に一般的ですが、ベースイメージがビルドされた後にディストリビューションリポジトリが新しいパッケージをリリースした場合も、コンテナー内で可能です。ディストリビューションのメンテナーとDockerfileのメンテナーの間には調整がない場合があります。これらはディストリビューションの下流にあり、数が多い場合があります。Debianリポジトリは1つだけですが、数千のjessie
ベースのコンテナイメージとDockerfileがあります。
さらに、ubuntuのような一部のアップストリームイメージは、ダウンロードしたインデックスを削除して、イメージを小さくし、古いファイルを回避します。そのため、ベースイメージの各バージョンではなく、最新のインデックスと共に出荷するために、ベースイメージの上に構築するときに、更新されたインデックスをダウンロードする必要があります。
リモートパッケージがもう存在せず、リンクが壊れる可能性はありますか?
確かに、インデックスに格納されているバージョンは非常に正確であるため5.7.19
(単純化、より似ています5.7.19-0ubuntu1
)。
debリポジトリについて合意された政治家はいますか?たとえば、リポジトリにパッケージの最後のバージョンのみを含める必要がありますか、それとも特定の配布リリースで使用可能なすべてのバージョンをリポジトリに含める必要がありますか?
更新プログラムが利用可能になると、古いマイナーバージョンはすぐに削除されるのが一般的です。バイナリの重さは数十メガバイトになり、サポートされるすべてのバージョンとアーキテクチャを掛け合わせられるため、これはサーバー上のスペースを節約するためだと思います。したがって、通常mysql-5.7.18
、次のように固定することはできませんapt-get install
。mysql-5.7.19
ディストリビューションでリリースされるとすぐに、以前のものは削除されます。
Dockerに公平を期すため、この非決定性apt-get update
は、各ディストリビューションのパッケージ管理の一部として持ち込まれる問題です。EC2またはVagrant仮想マシンを繰り返し構築しようとすると、同じ問題が発生します。
一部のシステム管理者は、Aptlyなどのサービスを使用して元のリポジトリをミラーリングし、特定のバージョンを固定できますが、更新プログラムのテストと変更を頻繁に実行する別のプロセスがない限り、セキュリティ更新プログラムを見逃すリスクがあります固定しています。