Docker - Должен ли я также сохранить базовый образ для --cache-from? - PullRequest
0 голосов
/ 24 сентября 2019

Это мой 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

Вопросы :

  1. Это правильное поведение?Могу ли я каким-то образом иметь 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: /
  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 .

Спасибо

...