【问题标题】:Dummy downsize after Docker buildDocker构建后的虚拟缩小
【发布时间】:2019-11-13 14:31:58
【问题描述】:

使用多阶段构建,我想缩小 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 图像中复制出来,这是书中最好的技巧,还是有其他方法可以最小化最终图像的大小?

【问题讨论】:

    标签: docker docker-build docker-multi-stage-build


    【解决方案1】:

    Distroless

    Google 提供说明和工具来帮助制作distroless images

    “Distroless”图像仅包含您的应用程序及其运行时依赖项。它们不包含包管理器、shell 或您希望在标准 Linux 发行版中找到的任何其他程序。

    为什么要使用 distroless 映像?

    将运行时容器中的内容严格限制为应用所需的内容是 Google 和其他在生产环境中使用容器多年的科技巨头采用的最佳做法。它改善了扫描仪(例如 CVE)的信噪比,并减轻了根据您的需要确定出处的负担。

    如果您的应用程序是已编译的二进制文件,那么您可以使用单个二进制文件加上它链接的共享库。如果你限制你链接的库,你可能只需要几个。例如,下面是我的机器上用 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 提供了一组针对不同语言的基础图片:

    他们只有一些基本的文件,远远少于像 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"]
    

    【讨论】:

      【解决方案2】:

      除了使用multi-stage之外,另一种典型的方式是使用docker-slim来减小最终构建图像的大小,如下所示:

      docker-slim build --http-probe your-name/your-app
      

      详情参考这个guide

      添加来自"Five Ways to Slim Your Docker Images"的其他常见想法以备不时之需:

      • 仔细考虑您的应用程序的需求
        • 只需在 dockerfile 中安装您真正需要的东西。
      • 使用小基础图片
      • 使用尽可能少的层
        • 将运行组合在一起,运行更多层,层数更多,尺寸更大
      • 使用 .dockerignore 文件
        • 如果使用COPY . /,则避免将所有内容复制到图像,此外,如果不使用.gitignore,则需要避免使用COPY . /,这可能会复制一些必要的东西到图像。
      • 压缩 Docker 映像
        • 这里的想法是,在创建图像后,使用docker-squash 等工具将其尽可能地展平。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-16
        • 1970-01-01
        • 2018-07-01
        • 2018-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多