Могут ли некоторые объяснить, что делает команда 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, для зеркалирования исходных репозиториев и могут закреплять определенную версию, но вы рискуете пропустить обновления безопасности, если у вас нет часто запускаемого отдельного процесса для тестирования обновлений и изменения того, что вы делаете. прикалывают.