Я пытаюсь настроить сборку CI, которая создает образ из Dockerfile, содержащий многоэтапную конфигурацию.
Вот требования:
- Необходимо использовать кеш слоев Docker, потому что он загружает много зависимостей приложения во время инструкции
RUN
. - Он должен автоматически удалять старые оборванные образы после каждой сборки. (Чтобы предотвратить ручную очистку в будущем
docker image prune
)
Мое типовое решение:
(просто для демонстрации проблемы) выглядит так:
docker build -t sample-app.
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Докерфайл:
FROM ubuntu:18.04 AS builder
WORKDIR /app
COPY some-file-for-build.txt /app
RUN echo 'building...'
FROM ubuntu:18.04
CMD ["echo", "running..."]
Проблема:
Из-за удаления висящих изображений кеш становится недействительным и при каждой сборке выполняется инструкция RUN
.
Неожиданное поведение с одноэтапной конфигурацией
Но если удалить 2-й шаг, измените Dockerfile на это:
FROM ubuntu:18.04
WORKDIR /app
COPY some-file-for-build.txt /app
RUN echo 'building...'
Кэш становится рабочим для инструкции RUN
.
Step 4/4 : RUN echo 'building...'
---> Using cache
---> 9c7c15230600
Вопросы:
- Есть ли способ заставить его работать в соответствии с требованиями?
- Почему кеш работает с одноэтапной конфигурацией, но не работает с многоэтапной?