Я использую docker для компиляции довольно медленного процесса C ++. Создание моего программного обеспечения занимает около 3 часов. Чтобы ускорить процесс, я добавил в смесь ccache
.
Итак, после сборки я делал следующее:
docker create --name=ccache LAST_IMAGE
затем, используя docker cp
, скопируйте каталог /root/.ccache
- смонтируйте его, а затем с помощью команды ADD
я заново вставлю tar в следующее изображение, когда пересоберу его.
Я просто переключился на следующий подход - так как казалось, что он занимает меньше промежуточного пространства на диске:
Когда я вызываю docker build
, я передаю аргумент сборки
77 │ - DOCKER_BUILDKIT=1 docker build --force-rm
78 │ --file devops/Dockerfile.buildAfsim
79 │ --build-arg GIT_COMMIT=${CI_COMMIT_SHA}
80 │ --build-arg PARENT_IMAGE=$DOCKER_REGISTRY$PARENT_IMAGE_NAME
81 │ --build-arg LAST_BUILD_IMAGE=$DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
82 │ --tag $DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME .
Ключевым моментом здесь является то, что я передаю само изображение дважды:
--build-arg LAST_BUILD_IMAGE=$DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
--tag $DOCKER_REGISTRY$AFSIM_BUILD_IMAGE_NAME
Это, в свою очередь, скажет моему процессу сборки докера вытянуть последнее изображение - скопируйте каталоги cmake
и cache
в текущий контекст докера
И в моем файле Docker у меня есть:
ARG LAST_BUILD_IMAGE
FROM ${LAST_BUILD_IMAGE} as last_build
# Pass in the base build image
ARG PARENT_IMAGE
FROM ${PARENT_IMAGE}
# Copy the ccache and cmake files from the previous run in order to speed up build speeds
# This will cause issues - if we dont actualy have a last build saved somewhere but we'll deal
# with that when we get to it.
copy --from=last_build /devel/software/build /devel/software/build
copy --from=last_build /root/.ccache /root/.ccache
Кто-нибудь делал что-то подобное раньше? Это сильно влияет на время сборки CI, но мне интересно, есть ли лучшие способы. Пока это лучшее, что я придумал.