динамически определять базовый образ докера, но поддерживать последующее кэширование - PullRequest
0 голосов
/ 03 мая 2019

У меня есть процесс сборки, который запускается для каждой ветви git. Он создает отдельные образы докеров с разными именами для каждой ветки git.

Сборка состоит из двух этапов. Сначала создается базовое изображение. Затем создаются два отдельных образа выпуска, которые зависят от базового образа. Образы релизов представляют собой два отдельных приложения.

Поскольку имя базового образа меняется для каждой ветви, я передаю имя базового образа, чтобы файлы Docker выпуска знали, какой базовый образ использовать:

ARG branchBaseImage

FROM "$branchBaseImage" AS release

# Some tasks dependent on base image
RUN R -e "install.packages('plumber')"
...

ENTRYPOINT ["R","--vanilla", "-f", "/app/run.R"]

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

Это сложно, я думал о том, чтобы попытаться упорядочить зависимости немного по-другому, но мое окончательное изображение должно быть базовым, с некоторыми дополнительными задачами.

Единственная возможность, о которой я подумал, - вместо передачи базового изображения в качестве аргумента создать заполнитель, который изменяется задачей оболочки в процессе CI перед вызовом docker build, чтобы обмануть докера, заставив его думать, что это статическая строка, которая не изменяется при последующих сборках, поэтому она может повторно использовать кэшированные слои после нее:

FROM ##branchBaseImagePlaceholder## AS release

# Some tasks dependent on base image
RUN R -e "install.packages('plumber')"
...

ENTRYPOINT ["R","--vanilla", "-f", "/app/run.R"]

Но я новичок в докере, поэтому чувствую, что могу упустить что-то очевидное.

...