Запустить контейнер из промежуточного слоя образа
Получаю последнюю версию образа:
docker pull postgres:alpine
Получаю такой лог:
alpine: Pulling from library/postgres
a0d0a0d46f8b: Already exists
5034a66b99e6: Pull complete
82e9eb77798b: Pull complete
314b9347faf5: Pull complete
2625be9fae82: Pull complete
5ec8358e2a99: Pull complete
2e9ccfc29d86: Pull complete
2a4d94e5dde0: Pull complete
Как мне запустить контейнер на основе слоя a0d0a0d46f8b?
Что-то похожее на docker run -it --rm a0d0a0d46f8b bash. Но так это не работает.
PS. Вариант получить версию по тегу не предлагать, так как на самом деле мне нужно решение для закрытого enterprise образа, в котором нет тегов, а тут postgres используется только в качестве примера.
Ответы (1 шт):
Насколько я знаю это только возможно для образов, которые были собраны вами на текущей машине. Как только вы сделали push/pull это уже не возможно.
Образ это набор метаданных (хеш образа и является хешем, этих метаданных), которые включают в себя список слоев. Стои являются неизменяемыми (это просто некая структура файлов с хешем) и как раз они и являются общими у нескольких образов. Например, если посмотреть на несколько образов основанных на одной версии alpine, то можно увидеть что первый свой у них всех одинаковый.
Когда вы создаете образ локально, то для некоторых слоев докер создает и образ, это необходимо для того, чтобы работал кэш (если вы используете дефолтный билдер, а не buildkit), чтобы при каждом билде не выполнять ненужную работу (а взять уже готовый образ и немного его изменить). Поэтому вы можете легко запустить такой образ, получив его хеш из логов или docker image inspect или docker history.
Но как только вы сделаете push/pull вам не нужен кеш и не нужна промежуточная информация, вы делаете push/pull только последнего образа и его слоев, игнорируя все промежуточные. Поэтому когда вы вызовете docker image inspect/docker history вы не увидите хешей образов, а только набор слоев, а их запускать нельзя.
Статья про Image IDs.