Docker-我是否也应该保存基本映像,以用于缓存?

Docker-我是否也应该保存基本映像,以用于缓存?,docker,docker-build,Docker,Docker Build,这是我的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

这是我的
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
我的期望是:使用
--从
缓存构建就足够了。
但是,阿尔卑斯山又被拉了回来。如果它被更改,它将使我的缓存无效

$ 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
    时(一个用于
    builder
    ,一个用于
    app
    ),就足够了,正如我所期望的那样?因此,如果不存在
    alpine
    ,就不需要
    pull
  • 如果没有(
    1.
    ),以下选项是否更好?不要使用来自alpine:latest的
    ,而是使用来自alpine:3.10的
    ?或
    3.10.2
    ?我希望在从不同的机器构建时确保缓存。我不知道哪个标签是“可靠的”,所以它不会改变:也就是说,当他们按下
    3.10
    时,他们会更新
    3
    ,因为
    3.10
    3
    的一部分。意思是
    3.10.2
    不会改变吗?除非出现
    3.10.2.2
    :/
  • 这是一个例子。我正在使用
    ubuntu:18.04
    作为基本图像,目前我没有找到类似
    ubuntu:18.04.3
    或类似的东西。因此,没有更具体的图像可以传递
  • 为什么困扰我:因为我将这些图像存储在docker存储库中。正因为如此,我还需要存储一个阿尔卑斯山的副本——我以前构建的副本。假设我把它叫做
    myalpine
    。那么我的构建将是:

    $ docker build -t app --cache-from myalpine --cache-from builder --cache-from app --target app .
    
    谢谢