做了个 Docker image,生成的 image 为什么会这么庞大,附 Dockerfile... - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qazwsxkevin
V2EX    Docker

做了个 Docker image,生成的 image 为什么会这么庞大,附 Dockerfile...

  •  
  •   qazwsxkevin 2024-12-11 20:47:03 +08:00 2699 次点击
    这是一个创建于 386 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```
    FROM alpine:latest

    # 替换为阿里云的 Alpine 源
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

    # 安装构建和运行所需依赖
    RUN apk add --no-cache \
    build-base \
    ca-certificates \
    tar \
    libressl-dev \
    perl \
    linux-headers \
    musl-dev

    # 将 OpenSSL 源码文件从宿主机复制到容器
    COPY openssl-3.4.0.tar.gz /opt/

    # 解压、编译并安装 OpenSSL
    WORKDIR /opt
    RUN tar -xzf openssl-3.4.0.tar.gz && rm openssl-3.4.0.tar.gz
    WORKDIR /opt/openssl-3.4.0
    RUN ./config no-shared no-zlib no-dso no-tests && \
    make && \
    make install && \
    make clean && \
    rm -rf /opt/openssl-3.4.0

    # 删除构建工具和临时文件
    RUN apk del --purge \
    build-base \
    ca-certificates \
    tar \
    perl \
    linux-headers \
    musl-dev \
    && rm -rf /tmp/* /var/cache/apk/* /usr/share/man /usr/share/doc /usr/share/locale

    # 更新动态链接库路径
    RUN echo "/usr/local/lib64" > /etc/ld-musl-x86_64.path

    # 设置环境变量
    ENV PATH="/usr/local/bin:${PATH}"
    ENV LD_LIBRARY_PATH="/usr/local/lib64:/usr/lib:/lib"

    # 默认命令
    CMD ["openssl", "version"]
    ```

    生成的镜像,有 440MB 之大,是不是有些残留没清干净? 还是 OpenSSL 编译完成,就这么大?
    10 条回复    2024-12-13 16:51:47 +08:00
    Orenoid
        1
    Orenoid  
       2024-12-11 20:53:11 +08:00
    大概率是因为删除构建工具和临时文件这一层,这样是无效的,它只是在这一层把文件标记为删除,要真正删除必须在同一层用 && 执行
    nagisaushio
        2
    nagisaushio  
       2024-12-11 21:00:25 +08:00 via Android
    建议二阶段构建,只拷贝编译完的东西过来
    sagaxu
        3
    sagaxu  
       2024-12-11 21:07:00 +08:00   1
    docker 的存储是分层的,你每一个 RUN 之后的文件系统都会保留快照,即使最后一个 RUN 是 rm -fr /,中间每一层也都会存储下来占用空间。

    1. 最快的解决方法是把 RUN 全部合并到一个,用&&连接起来。除此之外,以前可以 squash 后来废弃了,现在一般用 multi-stage ,把最终系统复制到一个干净的基准线,中间的 history 就丢弃了,有点儿像 git merge --squash 。

    2. 如果不怕踩坑,也可以试试 podman ,它提供--squash-all 选项构建干净系统。

    3. 最后可以试试 docker export 导出合并后的文件系统,基于这个再重新构建,设置好环境变量。
    ETiV
        4
    ETiV  
       2024-12-11 21:22:11 +08:00 via iPhone   1
    你要想镜像小就 multi-stage ,在最后一步把需要的东西 copy 出来,中间有多个 RUN 也无妨,还会最大化利用到缓存

    不过纯静态 build 一个可执行程序的话,我一般都单独用它,不会再给它放进 docker image 里…
    Ipsum
        5
    Ipsum  
       2024-12-11 21:39:35 +8:00
    兄弟,你把编译环境一起打包了?应该编译和 bin 分开,编译好了直接 copy 到运行环境中
    Tiller
        6
    Tiller  
       2024-12-11 22:34:51 +08:00
    你运行之后,进去看一下哪些文件比较大就知道了。

    我之前试过一个镜像 1g 多。我都震惊了

    慢慢排查,发现怎么随着版本更新,越来越大了呢?

    从半年前的 200m 渐渐变成 1g 多。

    我对前端的打包流程也不懂,就请教了大佬。他们最后发现,CI/CD 流程出问题了。。。每次打包的临时文件全都放进去了。

    最后每次构建之前删掉临时文件就恢复正常了。
    povsister
        7
    povsister  
       2024-12-11 22:52:12 +08:00
    不用 multi stage 就是一个 run 一层,你数一下你有多少个 run 吧
    wnpllrzodiac
        8
    wnpllrzodiac  
       2024-12-11 23:51:53 +08:00 via Android
    apt 缓存清一下。分 stage,build 后把二进制拷贝到发布 image 最干净
    mayli
        9
    mayli  
       2024-12-12 08:20:55 +08:00
    最简单办法,把所有命令串起来放到一个 run 里,就小了
    qq296015668
        10
    qq296015668  
       2024-12-13 16:51:47 +08:00   1
    改好了
    ```
    FROM alpine:latest

    ARG VERSION=3.4.0

    ARG DEPENDENCIES=" \
    build-base \
    ca-certificates \
    musl-dev \
    linux-headers \
    perl \
    tar \
    wget"

    WORKDIR /opt

    RUN --mount=type=cache,target=/var/cache/apk,sharing=locked \
    set -e \
    && apk add --no-cache --virtual .fetch-deps ${DEPENDENCIES} \
    && wget https://github.com/openssl/openssl/releases/download/openssl-${VERSION}/openssl-{VERSION}.tar.gz \
    && tar -xf openssl-${VERSION}.tar.gz \
    && cd /opt/openssl-${VERSION} \
    && ./config no-shared no-zlib no-dso no-tests \
    && make \
    && make install \
    && make clean \
    && echo "/usr/local/lib64" > /etc/ld-musl-x86_64.path \
    && cd /opt \
    && apk del .fetch-deps \
    && rm -rf /opt/openssl-${VERSION} openssl-${VERSION}.tar.gz

    ENV PATH="/usr/local/bin:${PATH}"
    ENV LD_LIBRARY_PATH="/usr/local/lib64:/usr/lib:/lib"

    CMD ["openssl", "version"]
    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2315 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 02:08 PVG 10:08 LAX 18:08 JFK 21:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86