Проверка работоспособности рефлексивного докера - PullRequest
1 голос
/ 14 июня 2019

Я использую 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, но мне интересно, есть ли лучшие способы. Пока это лучшее, что я придумал.

1 Ответ

1 голос
/ 14 июня 2019

Вы можете сохранить каталог кеша в томе.Запустите контейнер сборки следующим образом:

docker run -v ccache:/root/.ccache ...

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

Любые данные, записанные в /root/.ccache, будут автоматически доступны в будущих запусках, когда смонтирован том ccache.В любой момент вы можете запустить docker volume rm ccache, чтобы очистить кэш и запустить новую сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...