apt-get updateをいつ、なぜ使用する必要がありますか?


15

一般的な質問:

コマンドapt-get updateが何をするのか、そしていつそれを使うべきなのかを説明してもらえますか?


備考

詳細な回答をお願いします。バージョンが本当に詳細でない限り、manページのコピーだけではありません(manページから1つの定義を以下に示します)。

apt-get update:ソースからパッケージインデックスファイルを再同期するために使用されます。利用可能なパッケージのインデックスは、/ etc / apt / sources.list(5)で指定された場所から取得されます。更新は、アップグレードまたはdist-upgradeの前に常に実行する必要があります。


サブ質問:

  • パッケージインデックスはどこに保存されますか?データベース上?ファイルに?
  • apt-get installキャッシュを更新せずに行うとどうなりますか?リモートパッケージがもう存在しなくなり、リンクが壊れる可能性はありますか?
  • debリポジトリについて合意された政治家はいますか?たとえば、リポジトリにパッケージの最後のバージョンのみを含める必要がありますか、それとも特定の配布リリースで使用可能なすべてのバージョンをリポジトリに含める必要がありますか?

環境

私はDockerフレームワークを勉強しているので、質問します。その機能の1つはDockerfileで、このファイルから何らかの命令を実行することで、一種のOSイメージを構築できます。このイメージの特性の1つは、コンテキスト(ビルドの時間など)が何であれ、常に同じであることです。

apt-get update別の時間にコマンドを起動すると、結果が異なるため、画像が異なるのではないかと心配しています。


この投稿は、高レベルの質問をする方法に関するwiki記事として役立つと思います。非常に便利。
-Zerodf

回答:


12

apt-get update 利用可能なパッケージのリストをダウンロードします。

パッケージのリストは、時間の経過とともに変化する可能性があります。新しいパッケージが追加され、古いパッケージが削除されます。したがって、本当に古いキャッシュがあり、を実行しようとすると、apt-get install存在しないパッケージをダウンロードしようとする可能性があります。
古いパッケージがリポジトリに保持される期間は、リポジトリメンテナ(ディストリビューション)次第です。そのため、キャッシュが非常に古くなっているdockerなどを使用している場合はapt-get update、パッケージをインストールする前に必ず実行する必要があります。

パッケージを削除および追加する理由は、主にバグ修正とセキュリティ更新です。PPAのようなサードパーティのレポジトリを使用している場合でも、何でもできます。

企業環境でコンテナー化にdockerなどを使用する場合は、コンテナーを一度構築してから、そのコンテナーをさまざまなリリース環境(開発、ステージング、運用)に移動し、毎回コンテナーを再構築する必要はありません。これにより、テストされていない別のコンテナを取得しないようにします。

キャッシュファイルの保存場所に関する質問に答えるには、をご覧ください/var/lib/apt/lists


素晴らしい答えです!ありがとうございました!「(...)コンテナを毎回再構築しないでください。これにより、テストされていない別のコンテナを取得しないようにする」という段落に対応したいと思います。私は、apt-getアップグレードを使用しないことがベストプラクティスであることを読みました。その理由の1つは、「アプリケーションの実行方法とイメージに含まれる依存関係のバージョンの1つの真実の情報源がなくなったため、一貫性のないイメージが生成されること」です。それと同じ問題ではないapt-get updateですか?そして、Dockerfileは画像を保証するものではありませんか?
ピエールジャン

2
ちょっと。apt-get update新しくインストールされたパッケージにのみ影響します。既存のパッケージは、新しいパッケージで必要な場合にのみアップグレードされます(これは最小限である必要があります)。ではapt-get upgrade、あなた非常に異なる画像が得られ、既存のものを含むすべてのパッケージを、アップグレードしてください。これは、dockerfileからビルドするたびに異なる結果になる可能性がありますが、複数環境のリリースを経験する場合、これは深刻な問題ではないと個人的に考えています。dockerfileを他の人に配布してビルドしてもらうと、これは問題になると思います。
パトリック

0

コマンドapt-get updateが何をするのか、いつそれを使うべきなのかを説明できますか

apt-get update ディストリビューションのパッケージリポジトリから更新されたインデックスをダウンロードし、利用可能なすべてのパッケージとその正確なバージョンを一覧表示します。

UbuntuやDebianのような一般的なディストリビューションは、通常、パッケージ製品で保守的で下位互換性があるため、バージョンは時間とともにあまり変化しません。セキュリティの更新またはバグ修正により変更されます。たとえば、mysqlは5.7.18to からアップグレードできますが、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 installmysql-5.7.19ディストリビューションでリリースされるとすぐに、以前のものは削除されます。

Dockerに公平を期すため、この非決定性apt-get updateは、各ディストリビューションのパッケージ管理の一部として持ち込まれる問題です。EC2またはVagrant仮想マシンを繰り返し構築しようとすると、同じ問題が発生します。

一部のシステム管理者は、Aptlyなどのサービスを使用して元のリポジトリをミラーリングし、特定のバージョンを固定できますが、更新プログラムのテストと変更を頻繁に実行する別のプロセスがない限り、セキュリティ更新プログラムを見逃すリスクがあります固定しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.