使用 curl 优化 docker 图像构建大小

Optimize docker image build size with curl

我需要在 docker 上安装最新版本的 curl

使用以下内容时 docker 大小约为 140MB

FROM debian:10.7

RUN apt-get update && \
    apt-get install --no-install-recommends -y curl wget ca-certificates

这里使用curl 7.64

使用以下

FROM debian:10.7

RUN apt-get update && \
    apt-get install --yes --no-install-recommends wget build-essential ca-certificates libcurl4 && \
    wget https://curl.se/download/curl-7.73.0.tar.gz && \
    tar -xvf curl-7.73.0.tar.gz && cd curl-7.74.0 && \
    ./configure && make && make install && \
    apt-get purge -y --auto-remove build-essential && \

docker 图像大小为 240MB,我试图删除将大小从 440 减小到 240 的构建要素,有没有办法删除这个额外的 ~100MB ?

您应该将 rm -rf /var/lib/apt/lists/* 包含到您的 运行 指令中以删除 apt 索引文件,并可能包含 apt-get clean 以删除任何其他剩余的包文件。

除此之外,您还可以尝试使用 slim 图像版本,根据 Docker Hub debian:10.7-slim 几乎是一半大小(~24Mb vs ~48Mb)

最后,您可以从生成的映像中在容器上执行 du -h | sort -h 以找出剩余的 space 用法。

事实上,您已经接近解决方案了。漏掉的是删除curl源码包

所以接下来应该使图像缩小:

FROM debian:10.7

RUN apt-get update && \
    apt-get install --yes --no-install-recommends wget build-essential ca-certificates libcurl4 && \
    wget https://curl.se/download/curl-7.73.0.tar.gz && \
    tar -xvf curl-7.73.0.tar.gz && cd curl-7.73.0 && \
    ./configure && make && make install && \
    apt-get purge -y --auto-remove build-essential && \
    cd .. && rm -fr curl-7.73.0.tar.gz curl-7.73.0
    

没有卷曲:

$ docker images abc:1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abc                 1                   d742bfdf5fa6        25 seconds ago      148MB

使用 curl & 源包删除:

$ docker images abc:2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abc                 2                   afe3d404852a        27 minutes ago      151MB

另外,如果在Dockerfile中用rm -rf /var/lib/apt/lists/*删除apt缓存,if会更小:

$ docker images abc:3
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
abc                 3                   5530b0e9b44f        2 minutes ago       134MB

另一种解决方案可能使用 multistage-build,您可以使用 ./configure --prefix=xxx 设置默认安装位置,然后 stage1 仅用于构建 curl,而 stage2 将 xxx 文件夹从 stage1 复制到最终图像。

按照 atline 的建议使用多阶段构建:

FROM debian:10.7 AS builder

WORKDIR /app
RUN mkdir /app/usr2

RUN apt-get update && \
    apt-get install --yes --no-install-recommends wget build-essential ca-certificates libcurl4 && \
    wget https://curl.se/download/curl-7.73.0.tar.gz && \
    tar -xvf curl-7.73.0.tar.gz && cd curl-7.73.0 && \
    ./configure --prefix=/app/usr2 && make install

FROM debian:10.7

RUN apt-get update && \
    apt-get install --no-install-recommends -y wget ca-certificates &&\
    rm -rf /var/lib/apt/lists/*

COPY --from=builder /app/usr2/. /usr

最终大小为 129MB