Когда и почему я должен использовать обновление apt-get?

15

Общий вопрос:

Могут ли некоторые объяснить, что apt-get updateделает команда , и когда я действительно должен ее использовать?


замечания

Пожалуйста, дайте подробный ответ . Не просто копия справочной страницы, если только ваша версия не является действительно подробной (я поместил одно определение из справочной страницы ниже).

apt-get update : используется для повторной синхронизации файлов индекса пакета из их источников. Индексы доступных пакетов выбираются из местоположений, указанных в /etc/apt/sources.list(5). Обновление всегда должно выполняться перед обновлением или dist-upgrade.


Суб-вопросы:

  • Где хранится индекс пакета? В базе данных? На файл?
  • Что произойдет, если я apt-get installне обновлю кеш? Есть ли вероятность, что удаленный пакет больше не будет существовать и что ссылка будет разорвана?
  • Есть ли какая-то согласованная политика в отношении репозиториев deb? Например, должен ли репозиторий содержать только последнюю версию пакета, или наоборот, он должен содержать все версии, доступные для определенного выпуска выпуска?

контекст

Я задаю свой вопрос, потому что я изучаю структуру Docker . Одной из его функций является Dockerfile , который позволяет вам создавать своего рода образ ОС, выполняя некоторые инструкции из этого файла. Одним из свойств этого изображения является то, что оно всегда должно быть одинаковым, независимо от контекста (время сборки и т. Д.).

Я боюсь, что если я запущу apt-get updateкоманду в другое время, результат будет другим, и мои изображения будут другими.

Pierre-Jean
источник
Я думаю, что этот пост может послужить вики-статьей о том, как задать вопрос высокого уровня. Очень полезный.
Зеродф

Ответы:

12

apt-get update загружает список доступных пакетов.

Список пакетов может меняться со временем. Новые пакеты добавляются, а старые пакеты удаляются. Таким образом, если у вас действительно старый кеш, и вы пытаетесь сделать это apt-get install, он может попытаться загрузить пакет, который больше не существует.
Как долго старый пакет хранится в репозитории, зависит от сопровождающего репо (вашего дистрибутива). Таким образом, если вы используете что-то вроде Docker, где кеш может быть очень устаревшим, вы должны всегда запускаться apt-get updateперед установкой каких-либо пакетов.

Причиной удаления и добавления пакетов являются в основном исправления ошибок и обновления безопасности. Хотя, если вы используете сторонние репозитории, такие как PPA, все идет хорошо.

При использовании чего-то вроде docker для контейнеризации в корпоративной среде вы должны создать контейнер один раз, а затем перемещать этот контейнер через различные среды выпуска (разработка, подготовка, производство), а не перестраивать контейнер каждый раз. Это гарантирует, что вы не получите другой контейнер, который не был протестирован.

Чтобы ответить на ваш вопрос о том, где находятся файлы кэша /var/lib/apt/lists.

Патрик
источник
Отличный ответ! Спасибо! Я хочу отреагировать на пункт «(...) не перестраивать контейнер каждый раз. Это позволит вам не получить другой контейнер, который не был протестирован». Я читал, что лучше никогда не использовать apt-get upgrade. Одной из причин может быть: «Он также создает противоречивые изображения, потому что у вас больше нет единственного источника правды о том, как должно работать ваше приложение и какие версии зависимостей включены в изображение». Разве это не та же самая проблема с apt-get updateтогда? А Dockerfile не должен гарантировать изображение?
Пьер-Жан
2
Своего рода. apt-get updateповлияет только на новые установленные пакеты. Существующие пакеты будут обновлены только при необходимости новыми пакетами (это должно быть минимально). При этом apt-get upgradeвы обновляете все пакеты, включая существующие, в результате получается совершенно другой образ. Хотя это может приводить к разным результатам при каждой сборке из файла dockerfile, лично я не думаю, что это серьезная проблема, если вы пройдете через многоэкранный выпуск. Я думаю, что это больше проблема, если вы распространяете докер-файл другим людям и заставляете их создавать его.
Патрик
0

Могут ли некоторые объяснить, что делает команда apt-get update и когда мне действительно следует ее использовать?

apt-get update загружает обновленные индексы из репозиториев дистрибутива, перечисляя все доступные пакеты и их точные версии.

Распространенные дистрибутивы, такие как Ubuntu и Debian, обычно консервативны и обратно совместимы в своих пакетных предложениях, поэтому версии не будут сильно меняться со временем; они изменятся из-за обновлений безопасности или исправлений ошибок. Например, mysql может быть обновлен с 5.7.18до, 5.7.19но не до 6.x.

Где хранится индекс пакета? В базе данных? На файл?

Обычно он хранится в одном или нескольких файлах внутри /var/lib/apt. В контексте Docker эти файлы находятся внутри образа. При создании Dockerfile они сохраняются в новых слоях файловой системы, которые создаются и сохраняются как вновь созданный образ.

Что произойдет, если я установлю apt-get без обновления кэша?

Вы можете попробовать загрузить версии пакетов, которые больше не существуют. Это довольно часто встречается на виртуальных машинах, но возможно и внутри контейнеров, если репозитории-дистрибутивы выпустили новые пакеты после создания базового образа. Не может быть никакой координации между сопровождающими дистрибутива и сопровождающими Dockerfile, которые находятся ниже по потоку от дистрибутива и могут быть более многочисленными. Существует только один репозиторий Debian, но тысячи 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, для зеркалирования исходных репозиториев и могут закреплять определенную версию, но вы рискуете пропустить обновления безопасности, если у вас нет часто запускаемого отдельного процесса для тестирования обновлений и изменения того, что вы делаете. прикалывают.

giorgiosironi
источник