Как настроить docker для использования кэша из реестра на каждом шаге сборки
У меня есть два сервера с docker и один сервер с моим личным реестром.
Я построил Dockerfile на первой машине; затем я нажал изображение в реестр.
можно ли сразу создать Dockerfile на второй машине, используя кэш из моего реестра? Если нет, есть ли способ ускорить создание "почти" тех же Dockerfiles без написания моего собственного кэша?
он попытался настроить --registry-mirror
но это не помогло.
2 ответов
для docker > 1.10, я нашел что-то по этому вопросу:https://github.com/docker/docker/issues/20316#issuecomment-221289631
учитывая этот Dockerfile
FROM busybox
RUN mkdir this-is-a-test
RUN echo "hello world"
выполнить docker build -t caching-test .
тогда мы можем видеть слои, содержащие изображение с docker history caching-test
3e4a484f0e67 About an hour ago /bin/sh -c echo "Hello world!" 0 B
6258cdec0c4b About an hour ago /bin/sh -c mkdir this-is-a-test 0 B
47bcc53f74dc 9 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0 B
<missing> 9 weeks ago /bin/sh -c #(nop) ADD file:47ca6e777c36a4cfff 1.113 MB
изменение для сохранения / загрузки в 1.11 сохраняет связь между родительским и дочерним слоями, но только когда они сохраняются через docker save вместе. Мы можем см. родитель окончательного тестового изображения, запустив docker inspect test | grep Parent.
$ docker inspect caching-test | grep Parent
"Parent": "sha256:6258cdec0c4bef5e5627f301b541555883e6c4b385d0798a7763cb191168ce09",
это второй к вершине слой из нашей истории Докера вывода.
чтобы воссоздать кэш с помощью save и load, необходимо сохранить все изображения и слои, на которые ссылаются как на родителей. На практике это обычно означает, что вам нужно сохранить каждый слой, а также изображение из одной команды.
docker save caching-test 6258cdec0c4b busybox > caching-test.tar
-- обратите внимание, что мы также можем дать имена слоев вместо идентификаторов для команды save.
давайте очистим все, а затем перезагрузим изображение из файла tar.
docker rmi $(docker images -q)
. Убедитесь, что изображения не существует.
затем запустите docker load -i caching-test.tar
. Если вы посмотрите на изображения, вы увидите busybox, а затем кэширование-тест. Бег!--5--> покажет вам тот же результат, что и при первоначальном построении изображения. Это связано с тем, что родительские/дочерние отношения были сохранены через save и load. Вы даже можете запустить docker inspect caching-test | grep Parent
и увидеть точно такой же ID задается как родительский слой.
и запуск перестроения того же файла Dockerfile покажет вам, что кэш используется.
Sending build context to Docker daemon 5.391 MB
Step 1 : FROM busybox
---> 47bcc53f74dc
Step 2 : RUN mkdir this-is-a-test
---> Using cache
---> 6258cdec0c4b
Step 3 : RUN echo "hello world"
---> Using cache
---> 3e4a484f0e67
Successfully built 3e4a484f0e67
EDIT: ниже это работает только перед докером 1.10
на второй машине вы можете docker pull theimagefromthefirstdockerfileontheregistry
перед построением нового.
таким образом, вы уверены, что каждый слой присутствует на втором машина.
docker-engine не запрашивает реестр каждый раз, когда слой построен (он даже не знает об этом), это было бы слишком медленно/тяжело, поэтому я не думаю, что есть другой способ.
Примечание: выпуск 20316 ("вытягивание кэша сборки") был закрыт, потому что PR 26839 ("реализовать кэш сборки на основе массива истории") была объединена.
это позволяет, например, указать в --cache-from
изображение из предыдущей сборки CI.
добавляет возможность указать изображения, используемые в качестве источника кэша при сборке. Эти изображения не должны иметь локальную родительскую цепочку и могут быть извлечены из других реестров. Пользователь должен сделать обязательно используйте только надежные изображения в качестве источников.
использование:
docker pull myimage:v1.0
docker build --cache-from myimage:v1.0 -t myimage:v1.1 .
посмотреть коммит для слияния 7944480, for docker 1.13 (январь 2017).
как прокомментировал by javipolo
:
в случае, если кто-то сходит с ума с повторным использованием слоев, как и я, "фишка" - передать в
--cache-from
изображение, которое вы перестраиваете (и уже вытащили) и также изображение, которое он использует в качестве базы вFROM
.пример:
Dockerfile
изображенияcustom-gource:0.1
FROM base_image:2.2.1
RUN apt-get update && apt-get install gource
COPY myscript.sh /myscript.sh
для того, чтобы перестроить в другом хосте, не делая
apt-get
опять же, вам необходимо:
docker pull custom-gource:0.1
docker build --cache-from=base_image:2.2.1,custom-gource:0.1 . -t custom-gource:0.2
это может показаться слишком очевидным, но я долго боролся с этим, пока не понял, что вам тоже нужно включить базовое изображение