Это мой Dockerfile
:
FROM alpine:latest as builder
RUN touch /builder
FROM alpine:latest as app
RUN touch /app
CMD ["bash"]
Первая сборка тянет alpine
и строит builder
:
$ docker build -t builder --cache-from builder --target builder .
Sending build context to Docker daemon 14.85kB
Step 1/2 : FROM alpine:latest as builder
latest: Pulling from library/alpine
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Step 2/2 : RUN touch /builder
---> Running in d142125feb20
Removing intermediate container d142125feb20
---> 1adad9638a6c
Successfully built 1adad9638a6c
Successfully tagged builder:latest
Вторая сборка использует alpine
, построена builder
и строит app
:
$ docker build -t app --cache-from builder --cache-from app --target app .
Sending build context to Docker daemon 14.85kB
Step 1/5 : FROM alpine:latest as builder
---> 961769676411
Step 2/5 : RUN touch /builder
---> Using cache
---> 1adad9638a6c
Step 3/5 : FROM alpine:latest as app
---> 961769676411
Step 4/5 : RUN touch /app
---> Running in 702ee875f781
Removing intermediate container 702ee875f781
---> d2b010f12ee8
Step 5/5 : CMD ["bash"]
---> Running in 6c7a6354b8bf
Removing intermediate container 6c7a6354b8bf
---> e375b0b7905e
Successfully built e375b0b7905e
Successfully tagged app:latest
Теперь я удалил alpine
локально:
$ docker image rm alpine
Untagged: alpine:latest
Untagged: alpine@sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Я ожидал, что сборки с --cache-from
будет достаточно.
Но вместо этого alpine
снова вытягивается.И если он будет изменен, это приведет к аннулированию моего кэша.
$ docker build -t app --cache-from builder --cache-from app --target app .
Sending build context to Docker daemon 14.85kB
Step 1/5 : FROM alpine:latest as builder
latest: Pulling from library/alpine
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Step 2/5 : RUN touch /builder
---> Using cache
---> 1adad9638a6c
Step 3/5 : FROM alpine:latest as app
---> 961769676411
Step 4/5 : RUN touch /app
---> Using cache
---> d2b010f12ee8
Step 5/5 : CMD ["bash"]
---> Using cache
---> e375b0b7905e
Successfully built e375b0b7905e
Successfully tagged app:latest
Вопросы :
- Это правильное поведение?Могу ли я каким-то образом иметь
builder
как базовое изображение , поэтому при построении app
с двумя --cache-from
(один для builder
и один для app
) этого будет достаточно, как я и ожидал?Таким образом, pull
, если не существует? *1040*, если нет (1.
), лучше ли следующее?Вместо использования FROM alpine:latest
используйте FROM alpine:3.10
?или 3.10.2
?Я хочу обеспечить кэш при сборке с другой машины.Я не знаю, какой тег является «надежным», поэтому он не изменится: т.е. они обновляют 3
, когда нажимают 3.10
, потому что 3.10
является частью 3
.Значение 3.10.2
не изменится?если не будет 3.10.2.2
: / - Это пример.Я использую
ubuntu:18.04
в качестве базового изображения, и в настоящее время я не нашел что-то вроде ubuntu:18.04.3
или что-то подобное.Поэтому нет более конкретного изображения для передачи.
Почему это беспокоит меня: потому что я храню эти изображения в моем хранилище докеров.И из-за этого мне нужно хранить копию alpine - ту, которую я использовал для сборки.Допустим, я называю это myalpine
.Тогда моя сборка будет:
$ docker build -t app --cache-from myalpine --cache-from builder --cache-from app --target app .
Спасибо