Docker:我们可以重用一个图像层来构建另一个图像吗?

时间:2019-03-03 16:47:59

标签: docker

我已经在本地创建了一个图像,它包含两层

$ docker images inspect existingimagename

"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:e21695bdc8e8432b1a119d610d5f8497e2509a7d040ad778b684bbccd067099f",
                "sha256:3ff73e68714cf1e9ba79b30389f4085b6e31b7a497f986c7d758be51595364de"
            ]
        },

现在,我正在构建另一个图像,并希望节省空间。上一个映像的第一层是主文件系统。所以我决定使用它

FROM  sha256:e21695bdc8e8432b1a119d610d5f8497e2509a7d040ad778b684bbccd067099f
ENV LANG=en_US.UTF-8
CMD ["/usr/bin/bash"]

然后我尝试构建新图像

$ docker build -t newimage -f Dockerfile .
Sending build context to Docker daemon  443.5MB
Step 1/3 : FROM sha256:e21695bdc8e8432b1a119d610d5f8497e2509a7d040ad778b684bbccd067099f
pull access denied for sha256, repository does not exist or may require 'docker login'

出现错误。

那么如何处理。

1 个答案:

答案 0 :(得分:1)

从图像层缓存中获利的一种简单方法是仅在第一层创建基本图像。

然后在其他Dockerfile中使用FROM <base image>

这样,将节省磁盘空间,因为多个映像将共享同一层,并且构建速度也会更快。

Dockerfile-base:

FROM scratch
ADD ./system.tar.gz /
docker build -f Dockerfile-base -t base .

Dockerfile-1:

FROM base
COPY ./somefiles /
docker build -f Dockerfile-1 -t image1 .

Dockerfile-2:

FROM base
COPY ./otherfiles /
docker build -f Dockerfile-2 -t image2 .

推荐读物

Best practices for writing Dockerfiles § Leverage build cache