Какова цель «docker build --pull»?

17

При создании образа докера вы обычно используете docker build ..

Но я обнаружил, что вы можете указать --pull, так что вся команда будет выглядетьdocker build --pull .

Я не уверен насчет цели --pull. Официальная документация докеров гласит: «Всегда пытайтесь использовать более новую версию образа», и я не уверен, что это означает в этом контексте.

Вы используете docker buildдля создания нового образа и в конечном итоге опубликовать его где-нибудь в реестре контейнера. Почему вы хотите вытащить то, что еще не существует?

Я бы ожидал, что что-то столь же «простое», как это, будет легко найти в Интернете, но ни у кого, похоже, нет такого вопроса, как этот. Единственный реальный успех в Google относится к официальным документам Dockers, которые я (как указано выше) не понимаю.

Спасибо за вашу помощь!

Джим Ахо
источник

Ответы:

17

он извлечет последнюю версию любого базового образа (ов) вместо повторного использования того, что вы уже пометили локально

возьмите, например, изображение, основанное на движущемся теге (например, ubuntu:bionic). апстрим периодически вносит изменения и перестраивает их, но у вас может быть локальный образ месяца. Докер с радостью построит против старой базы. --pullбудет тянуть как побочный эффект, так что вы строите против последнего базового изображения

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

Энтони Соттиль
источник
Это очень хорошее объяснение с ubuntu:bionicизображением, так как к нему (очевидно) не прикреплена версия, но он все равно будет другим, когда они публикуют новое изображение. Все имеет смысл. Спасибо!
Джим Ахо
1
Если базовое изображение будет, ubuntu:0.1.0например, и они опубликовали новое изображение, но с той же версией, т. Е. ubuntu:0.1.0- означает ли это, что docker build --pullснова будет загружено все новое изображение снова? (это было бы то, что большинство людей предпочитают, я думаю)
Джим Ахо
Я надеюсь, что кто-то прояснит последний вопрос от @JimAho, потому что это то, что я тоже хочу понять. Если изображение было только что сдвинуто, и больше ничего не изменилось, значит ли это, что оно не восстановлено?
learning2learn
2
@ learning2learn ответ - да, тег изображения докера - это просто строка, поэтому «0.1.0» ничем не отличается от примера в ответе «бионический»
Энтони Соттил,
@AnthonySottile Спасибо. очень сильно.
learning2learn
1

Простой ответ docker buildиспользуется для сборки из локального докер-файла. docker pullиспользуется, чтобы вытащить из док-концентратора. Если вы используете сборку Docker без файла Docker, он выдаст ошибку.

Когда вы указываете --pullили :latestDocker будет пытаться загрузить самую новую версию (если таковые имеются)

По сути, если вы добавите --pull, он будет пытаться получить самую новую версию при каждом запуске.

DuDoff
источник
Если у вас есть многослойные изображения - будет ли он тянуть их все всегда ?
Джим Ахо
Если у вас есть многоуровневые изображения, некоторые из них будут кэшироваться на машине (более старые слои) и любые новые слои будут извлечены.
DuDoff
0

Docker позволяет пропускание  --pull флага  docker build, например  docker build . --pull -t myimage. Это рекомендуемый способ гарантировать, что сборка всегда использует самый последний образ контейнера, несмотря на локальную версию. Однако стоит упомянуть еще об одном:

Чтобы убедиться, что ваша сборка полностью перестроена, включая проверку базового образа на наличие обновлений, используйте при сборке следующие параметры:

--no-cache - Это приведет к восстановлению уже доступных слоев.

Поэтому полная команда будет выглядеть так:

docker build . --pull --no-cache --tag myimage:version

Те же параметры доступны для docker-compose:

docker-compose build --no-cache --pull

goodbye_for_now
источник
При нормальном использовании вам не нужно --no-cache. Если базовый образ обновляется (и --pullполучает новую версию), это автоматически делает кэш недействительным; Точно так же, если у вас COPYдругой код, который сделает кеш недействительным. Единственное, на что это обычно влияет, - это если вы делаете что-то вроде apt-get installсетевого пакета, и в этом случае --no-cacheон будет проверять наличие более новой версии, даже если базовый образ не обновился.
Дэвид Мэйз