我想为我的项目创建尽可能小的图像,所以我使用带有 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。
知道什么会导致这样的结果吗?
答案 0 :(得分:1)
经过长时间的调查,我发现:
因此,在我的情况下,复制所有 *.so
文件会导致每个符号链接被复制为该符号链接指向的常规文件。这种转变导致我的图像尺寸增加。
了解后,我用谷歌搜索并找到了参考here