Существующие слои не перезаписываются.
Вот как docker push / pull работает в соответствии с v2 API :
Docker Изображение состоит из файла отдельного манифеста и отдельных слоев. Эти слои хранятся в виде BLOB-объектов в реестре с ключами их дайджестов. Файл манифеста будет содержать все детали, необходимые для извлечения, установки, проверки и запуска образа. Он также содержит список слоев, составляющих изображение.
Нажатие изображения
Когда вы нажимаете изображение, клиент сначала извлекает слои sh, а затем загружает подписанный манифест . Таким образом, если pu sh будет прервано до загрузки манифеста, в реестре будет лежать несколько ссылок, на которые нет ссылок. Когда запускается сборка мусора, эти BLOB-объекты удаляются.
При загрузке слоя клиент спрашивает реестр, есть ли у него этот слой или нет. Если в реестре уже есть слой, загрузка определенного слоя пропускается. Если в реестре нет слоя, клиент запросит загрузку, а реестр возвращает URL-адрес, который клиент может использовать для загрузки слоя. Слой может быть загружен в виде фрагментов или в виде монолитного c одного фрагмента. После загрузки всех чанков клиент должен отправить дайджест уровня в реестр, который будет проверен реестром, и вернуть сообщение об успешном завершении, если дайджест загруженного содержимого совпадает. Только после проверки дайджеста выгрузка считается завершенной.
После того, как все слои сдвинуты, клиент загружает файл манифеста изображения. Реестр проверяет наличие в манифесте всех ссылок на слои и возвращает соответствующие ошибки, например BLOB_UNKNOWN
, если этого не происходит.
Вытягивание изображения
Вытягивание изображений работает аналогично, но в обратном порядке. При извлечении изображения клиент сначала запрашивает манифест изображения, а затем загружает слои , которых у него нет. Загрузка завершена, только если дайджесты проверены.