docker multi-stage - 为什么复制文件夹的一部分而不是复制整个文件夹会产生更大的图像?

时间:2021-02-24 09:50:24

标签: docker

我想为我的项目创建尽可能小的图像,所以我使用带有 distroless 的多阶段 docker。我只复制运行时所需的文件。从几个文件夹中,我只复制 .so 文件而不是复制所有文件夹,我可以看到创建的图像变小了。

但是有一个文件夹,当我复制整个文件夹时,我得到的图像明显小于仅复制 .so 文件。

使用以下 Dockerfile 我复制整个 /usr/lib/x86_64-linux-gnu 文件夹:

#stage 1
FROM some_image AS builder

ADD something /home/

RUN mkdir ...
    cmake ...

#stage 2
FROM gcr.io/distroless/cc-debian10

COPY --from=builder /home/some/folders
COPY --from=builder /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu

WORKDIR /home/

CMD ["/bin/bash"]

图片大小为 618MB。

但是使用以下 Dockerfile,我只复制了 /usr/lib/x86_64-linux-gnu 文件夹中的 *.so 文件:

#stage 1
FROM some_image AS builder

ADD something /home/

RUN mkdir ...
    cmake ...

#stage 2
FROM gcr.io/distroless/cc-debian10

COPY --from=builder /home/some/folders
COPY --from=builder /usr/lib/x86_64-linux-gnu/*.so /usr/lib/x86_64-linux-gnu/*.so.* /usr/lib/x86_64-linux-gnu/

WORKDIR /home/

CMD ["/bin/bash"]

令人惊讶的是,图像大小现在是 683MB。大了 65MB。

知道什么会导致这样的结果吗?

1 个答案:

答案 0 :(得分:1)

经过长时间的调查,我发现:

  • 使用符号链接复制整个文件夹会保留符号链接
  • 复制符号链接直接创建常规文件

因此,在我的情况下,复制所有 *.so 文件会导致每个符号链接被复制为该符号链接指向的常规文件。这种转变导致我的图像尺寸增加。

了解后,我用谷歌搜索并找到了参考here