Предположим, мой Dockerfile выглядит следующим образом
FROM base
RUN A1
RUN A2
RUN B1
RUN B2
Где A1, A2, B1, B2 - команды, так что A2 зависит от успешного выполнения A1, B2 зависит от успешного выполнения B1.
Но A1 и A2 не зависят от B1 и B2, что означает, что я получу те же результаты, если вместо этого мой Dockerfile будет
FROM base
RUN B1
RUN B2
RUN A1
RUN A2
Теперь у меня проблема в том, что B2 и A2 - тяжелые операции, поэтому я хочу использовать кэш сборки , когда это возможно. То есть Я не хочу, чтобы изменения в команде A1 заставляли В2 снова запускаться, и я не хочу, чтобы изменения в команде В1 заставляли А2 (и, возможно, даже А1) запускаться снова.
Но я в затруднении, потому что если я использую первый порядок команд, то изменения в A1 приведут к повторному запуску B1 и B2, а если я использую второй порядок, то любые изменения в B1 вызовут A1 и снова запустить A2.
Я не могу придумать какой-нибудь изящный способ сделать то, что я ищу.
Лучшее решение, которое я смог придумать , чтобы получить то, чего я хочу достичь, - это иметь два отдельных изображения
Dockerfile A:
FROM base
RUN A1
RUN A2
Dockerfile B:
FROM base
RUN B1
RUN B2
А затем использовать многоступенчатую сборку для их объединения, т. Е. Иметь третий финальный Dockerfile
FROM A:latest as builder
FROM B:latest
COPY --from=builder /files/made/by/commands/A1/and/A2
Что имеет очевидный недостаток в том, что вам нужно вручную выяснить изменения, внесенные командами А1 и А2, то есть узнать, какие файлы скопировать в многоступенчатый сборочный Dockerfile. Это может быть сложно, поскольку команды A1 и A2 могут устанавливать двоичные файлы, изменять файлы конфигурации и т. Д.