Docker构建后虚拟模型缩小

时间:2019-07-02 23:02:45

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

使用多阶段构建,我想在Dockerfile的末尾缩小映像的大小,像这样:

FROM ubuntu AS ubuntu_build

RUN # do a lot of build things

FROM alpine

COPY --from=ubuntu_build /app /app

ENTRYPOINT whatever

高山图像很小,从理论上讲,只有/ app东西会从ubuntu图像中复制,这是本书中的最佳技巧,还是有其他方法来减小最终图像的大小? / p>

2 个答案:

答案 0 :(得分:6)

Distroless

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

  

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

     

为什么我应该使用非破坏性图像?

     

将运行时容器中的内容严格限制为应用程序所需的内容是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"]

答案 1 :(得分:5)

除了使用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之类的工具尽可能地将其展平。