使用多阶段构建,我想在Dockerfile的末尾缩小镜像的大小,如下所示:

FROM ubuntu AS ubuntu_build

RUN # do a lot of build things

FROM alpine

COPY --from=ubuntu_build /app /app

ENTRYPOINT whatever

Alpine 图片很小,理论上只有/ app东西会从ubuntu图片中复制出来,这是书中的最佳技巧,还是有其他方法来减小最终图片的大小?

最佳答案

一发不可收拾

Google提供了帮助制作distroless images的说明和工具。



如果您的应用程序是已编译的二进制文件,那么您可以摆脱一个二进制文件及其链接的共享库的困扰。如果限制要链接的库,则可能只需要几个。例如,这是在我的机器上针对使用gcc编译的最小C程序的链接:

$ ldd basic-program
        linux-vdso.so.1 (0x00007fffd3fa2000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2e4611b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f2e4670e000)

哎呀,您甚至可以静态链接整个程序,而完全没有依赖项。

Google提供了一组针对不同语言的基础图像:
  • gcr.io/distroless/static(Go,Rust,D)
  • gcr.io/distroless/base(C,C++)
  • gcr.io/distroless/java(Java)
  • gcr.io/distroless/cc(Rust,D)

  • 它们只包含一些基本文件,远远少于像alpine这样的最小发行版,因为它仍然具有apk程序包管理器,用户空间实用程序等。使用它们的方式与问题描述相同:最后一个多阶段构建中的阶段。
    FROM gcr.io/distroless/base
    COPY --from=build /go/bin/app /
    CMD ["/app"]
    

    从头开始

    您也可以走完整的原始森林生活路线,构建最终图像FROM scratch。没有比这更纯净的了。绝对没有您没有放在那里的东西。例如,这是traefik选择的路线。
    FROM scratch
    COPY certs/ca-certificates.crt /etc/ssl/certs/
    COPY traefik /
    EXPOSE 80
    VOLUME ["/tmp"]
    ENTRYPOINT ["/traefik"]
    

    08-28 08:11