Что такое кэширование и слои кэширования в контейнерах
Что проверяют
Понимаете ли вы, что в контейнерах слово «слои» означает прежде всего слои образа, и умеете ли собрать сервис на Go так, чтобы сборка не повторяла одну и ту же работу. Заодно проверяют, отличаете ли вы кэш сборки от кэша во время работы приложения.
Как отвечать
Сначала разделите два смысла. Кэш сборки: каждая инструкция в Dockerfile даёт слой, слой переиспользуется, пока не изменились сама инструкция и её входные файлы. Изменился один слой, все следующие за ним пересобираются. Отсюда правило порядка: редко меняющееся выше, часто меняющееся (исходники) ниже.
FROM golang AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
go build -o /out/app ./cmd/app
FROM scratch
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]Зависимости отдельным шагом: слой с go mod download переживает правку кода и пересобирается только при изменении файлов модуля. Кэш компилятора живёт дольше сборки за счёт монтирования кэша BuildKit. Многоступенчатая сборка выбрасывает тулчейн и оставляет один бинарник, образ уменьшается на порядки.
Второй смысл это кэш во время работы. Кэш в процессе (карта под мьютексом или библиотека со сроком жизни и вытеснением) живёт в памяти пода, умирает при перезапуске, и у каждой реплики он свой. Общий кэш вроде Redis переживает перезапуск и одинаков для всех реплик, но добавляет сетевой вызов и требует ответа на вопрос об инвалидации.
Где спотыкаются
Ставят COPY . . перед загрузкой зависимостей. Тогда правка любого файла, включая документацию, сбрасывает слой с модулями, и каждая сборка заново тянет их из сети.
Отвечают про Redis и CDN на вопрос о контейнерах. Это другой слой: спросили про сборку образа, а рассказ пошёл про архитектуру приложения. Стоит уточнить, о чём именно речь, и дать оба смысла коротко.
Держат кэш в памяти пода и удивляются, что пользователь видит то новое, то старое. Реплик несколько, копия у каждой своя, общей инвалидации нет. Либо общий кэш, либо короткий срок жизни и осознанное согласие на расхождение.