Разумная сборка кешей в докере для независимых команд - PullRequest
0 голосов
/ 11 мая 2018

Предположим, мой 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 могут устанавливать двоичные файлы, изменять файлы конфигурации и т. Д.

1 Ответ

0 голосов
/ 11 мая 2018

Что имеет очевидный недостаток в том, что вам нужно вручную вычислять изменения, сделанные командами А1 и А2.

Затем вам нужен способ отслеживать, что A: последний и B: последний.
Перестроить A, затем:

  • , если A: последний изменился(относится к новому SHA256), тогда да, выполните многоступенчатую сборку для B.
  • , если A не изменился, вы можете построить B не из base, а из A:latest.
    Если само B не изменилось, оно будет быстрым.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...