Создание образа докера из определенного слоя изображения - PullRequest
0 голосов
/ 29 января 2019

Что я хочу

У меня есть Dockerfile, который больше не собирается, потому что некоторые из его начальных этапов сборки основаны на службах, которые больше не доступны, и было бы затруднительно повернутьинженер.Все это скоро будет переписано, но сейчас я хотел бы просто перестроить изображение с исправлением из слоя, содержащего шаг задачи.

Мой Dockerfile выглядит примерно так:

FROM ubuntu:14.04
RUN this_thing_that_breaks
RUN apt-get install etc
COPY blah
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.рабочее изображение из репо: docker pull ecr/my-image:cache docker build --cache-from ecr/my-image:cache -t ecr/my-image:fix .

На этом этапе я ожидал, что моя сборка будет использовать существующие слои :cache для построения :fix, но мойсборка началась с нуля и не удалась.

В этом посте с объяснением слоя , похоже, говорится, что после 1.10 образы докеров поставляются со всеми своими слоями в целом, и эти слои на самом деле не являютсядоступны больше.
Однако, когда я смотрю на docker inspect ecr/my-image:cache, я вижу целую кучу идентификаторов sha256 слоев.Что снова заставляет меня думать, что должен быть способ указать на конкретный слой и использовать его в качестве основы кеша.

Можно ли создать образ докера, используя список идентификаторов sha256 слоев?

Я планирую уничтожить это после того, как исправлю, так что элегантность здесь не нужна.

Дополнительная информация

$ docker version
Version:           18.09.1
API version:       1.39
OS/Arch:           darwin/amd64

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.1

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Проблема в этом случае заключалась в том, что docker build и docker-compose build не используют один и тот же кеш

Изображение изначально было создано с docker-compose, и я использовал прямойup docker.
При использовании docker-compose кэшированные слои использовались, как и ожидалось.

Хотя это не отвечает на вопрос о том, как построить изображение из некоторых указанных слоев, оно сняло мои препятствия.

0 голосов
/ 29 января 2019

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

Я надеюсь, что это работает, но я не подтвердил это.Если это не работает, я предлагаю проверить эту проблему и проверить опции, упомянутые там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...