Общий вопрос:
Могут ли некоторые объяснить, что apt-get update
делает команда , и когда я действительно должен ее использовать?
замечания
Пожалуйста, дайте подробный ответ . Не просто копия справочной страницы, если только ваша версия не является действительно подробной (я поместил одно определение из справочной страницы ниже).
apt-get update : используется для повторной синхронизации файлов индекса пакета из их источников. Индексы доступных пакетов выбираются из местоположений, указанных в /etc/apt/sources.list(5). Обновление всегда должно выполняться перед обновлением или dist-upgrade.
Суб-вопросы:
- Где хранится индекс пакета? В базе данных? На файл?
- Что произойдет, если я
apt-get install
не обновлю кеш? Есть ли вероятность, что удаленный пакет больше не будет существовать и что ссылка будет разорвана? - Есть ли какая-то согласованная политика в отношении репозиториев deb? Например, должен ли репозиторий содержать только последнюю версию пакета, или наоборот, он должен содержать все версии, доступные для определенного выпуска выпуска?
контекст
Я задаю свой вопрос, потому что я изучаю структуру Docker . Одной из его функций является Dockerfile , который позволяет вам создавать своего рода образ ОС, выполняя некоторые инструкции из этого файла. Одним из свойств этого изображения является то, что оно всегда должно быть одинаковым, независимо от контекста (время сборки и т. Д.).
Я боюсь, что если я запущу apt-get update
команду в другое время, результат будет другим, и мои изображения будут другими.
Ответы:
apt-get update
загружает список доступных пакетов.Список пакетов может меняться со временем. Новые пакеты добавляются, а старые пакеты удаляются. Таким образом, если у вас действительно старый кеш, и вы пытаетесь сделать это
apt-get install
, он может попытаться загрузить пакет, который больше не существует.Как долго старый пакет хранится в репозитории, зависит от сопровождающего репо (вашего дистрибутива). Таким образом, если вы используете что-то вроде Docker, где кеш может быть очень устаревшим, вы должны всегда запускаться
apt-get update
перед установкой каких-либо пакетов.Причиной удаления и добавления пакетов являются в основном исправления ошибок и обновления безопасности. Хотя, если вы используете сторонние репозитории, такие как PPA, все идет хорошо.
При использовании чего-то вроде docker для контейнеризации в корпоративной среде вы должны создать контейнер один раз, а затем перемещать этот контейнер через различные среды выпуска (разработка, подготовка, производство), а не перестраивать контейнер каждый раз. Это гарантирует, что вы не получите другой контейнер, который не был протестирован.
Чтобы ответить на ваш вопрос о том, где находятся файлы кэша
/var/lib/apt/lists
.источник
apt-get update
тогда? А Dockerfile не должен гарантировать изображение?apt-get update
повлияет только на новые установленные пакеты. Существующие пакеты будут обновлены только при необходимости новыми пакетами (это должно быть минимально). При этомapt-get upgrade
вы обновляете все пакеты, включая существующие, в результате получается совершенно другой образ. Хотя это может приводить к разным результатам при каждой сборке из файла dockerfile, лично я не думаю, что это серьезная проблема, если вы пройдете через многоэкранный выпуск. Я думаю, что это больше проблема, если вы распространяете докер-файл другим людям и заставляете их создавать его.apt-get update
загружает обновленные индексы из репозиториев дистрибутива, перечисляя все доступные пакеты и их точные версии.Распространенные дистрибутивы, такие как Ubuntu и Debian, обычно консервативны и обратно совместимы в своих пакетных предложениях, поэтому версии не будут сильно меняться со временем; они изменятся из-за обновлений безопасности или исправлений ошибок. Например, mysql может быть обновлен с
5.7.18
до,5.7.19
но не до6.x
.Обычно он хранится в одном или нескольких файлах внутри
/var/lib/apt
. В контексте Docker эти файлы находятся внутри образа. При создании Dockerfile они сохраняются в новых слоях файловой системы, которые создаются и сохраняются как вновь созданный образ.Вы можете попробовать загрузить версии пакетов, которые больше не существуют. Это довольно часто встречается на виртуальных машинах, но возможно и внутри контейнеров, если репозитории-дистрибутивы выпустили новые пакеты после создания базового образа. Не может быть никакой координации между сопровождающими дистрибутива и сопровождающими Dockerfile, которые находятся ниже по потоку от дистрибутива и могут быть более многочисленными. Существует только один репозиторий Debian, но тысячи
jessie
образов контейнеров на основе и Dockerfile.Более того, некоторые исходные изображения, такие как ubuntu, удаляют загруженный индекс, чтобы уменьшить размер изображения и избежать появления там устаревших файлов. Таким образом, ожидается, что обновленный индекс следует загружать при построении поверх базового изображения, а не для каждой версии базового изображения, поставляемой с последним индексом.
Определенно, потому что версии, хранящиеся в индексе, очень точны
5.7.19
(упрощение; они больше похожи на5.7.19-0ubuntu1
).Обычно старые второстепенные версии удаляются быстро, когда доступно обновление; Я предполагаю, что это экономит место на серверах, поскольку двоичные файлы могут весить несколько десятков мегабайт, умноженные на все поддерживаемые версии и архитектуры. Так что, как правило, невозможно закрепить, скажем,
mysql-5.7.18
в последующемapt-get install
; как толькоmysql-5.7.19
будет выпущен дистрибутив, предыдущий будет удален.Чтобы быть справедливым для Docker, эта недетерминированность
apt-get update
является проблемой, которая рассматривается как часть управления пакетами каждого дистрибутива. У вас возникнет та же проблема, если вы попытаетесь создать виртуальную машину EC2 или Vagrant повторно.Некоторые системные администраторы используют такие службы, как Aptly, для зеркалирования исходных репозиториев и могут закреплять определенную версию, но вы рискуете пропустить обновления безопасности, если у вас нет часто запускаемого отдельного процесса для тестирования обновлений и изменения того, что вы делаете. прикалывают.
источник