Чтобы использовать определенный слой изображения в качестве основы другого изображения, можно напрямую использовать хэш слоя SHA256 в инструкции FROM
.
Например, допустим, у вас есть этот файл Dockerfile
FROM ubuntu:14.04
RUN this_thing_that_breaks
RUN apt-get install etc
COPY blah
и уже успешно создали образ из этого Dockerfile (в то время this_thing_that_breaks
работало).RUN this_thing_that_breaks
недавно перестал работать, и мы не можем сейчас создать образ.
Скажем, уже созданное изображение помечено my-image:cache
.Чтобы найти идентификатор SHA256 для точного слоя, который ломается, запустите docker history my-image:cache
и запишите идентификатор SHA256 (тот, который соответствует RUN this_thing_that_breaks
здесь).
Скажите, что записанный идентификатор SHA256 - 066a73a3a0c4
.Теперь удалите все инструкции до RUN this_thing_that_breaks
и замените его на FROM 066a73a3a0c4
.
FROM 066a73a3a0c4
RUN apt-get install etc
COPY blah
Теперь создайте новый образ my-image:fix
, используя docker build --cache-from my-image:cache -t my-image:fix .
.Теперь для создания нового изображения следует использовать определенный слой разрыва, который уже кэширован в качестве базового изображения.
Надеюсь, это поможет!
Предыдущий ответ:
Причиной, по которой кэш не используется, может быть то, что ubuntu:14.04
изображение в ecr/my-image:cache
и локально кэшированное ubuntu:14.04
изображение не совпадают с описанными здесь:
https://github.com/moby/moby/issues/26065#issuecomment-249046559
Если изображение FROM
изменяется, кэш не используется повторно.Это полезно и действительно важно, потому что в противном случае пользователь не может обнаружить наличие важных исправлений безопасности в базовом образе, поскольку он всегда использует кэш.Но это также может стать сюрпризом для некоторых пользователей.Я думаю, что мы не должны пытаться обходить его, вместо этого, если некоторые пользователи хотят иметь другое поведение, им следует просто использовать неизменяемые теги или дайджесты как FROM
изображение.
Итак, один вариантЯ вижу, чтобы удалить локально кэшированный ubuntu:14.04
, используя docker rmi ubuntu:14.04
, а затем запустить docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix
.
Я надеюсь, что это работает, но я не подтвердил это.Если это не работает, я предлагаю проверить эту проблему и проверить опции, упомянутые там.