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

时间:2020-12-28 07:59:42

标签: linux docker curl dockerfile debian

我需要在 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 的构建要素,有没有办法删除这个额外的 {{ 1}} ?

3 个答案:

答案 0 :(得分:1)

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

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

最后,您可以从生成的图像对容器执行 du -h | sort -h 以找出剩余空间使用情况。

答案 1 :(得分:1)

事实上,您已经接近解决方案了。你错过的一个是删除 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 复制到最终图像。

答案 2 :(得分:1)

按照 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