1
Orenoid 9 天前
大概率是因为删除构建工具和临时文件这一层,这样是无效的,它只是在这一层把文件标记为删除,要真正删除必须在同一层用 && 执行
|
2
nagisaushio 9 天前 via Android
建议二阶段构建,只拷贝编译完的东西过来
|
3
sagaxu 9 天前 1
docker 的存储是分层的,你每一个 RUN 之后的文件系统都会保留快照,即使最后一个 RUN 是 rm -fr /,中间每一层也都会存储下来占用空间。
1. 最快的解决方法是把 RUN 全部合并到一个,用&&连接起来。除此之外,以前可以 squash 后来废弃了,现在一般用 multi-stage ,把最终系统复制到一个干净的基准线,中间的 history 就丢弃了,有点儿像 git merge --squash 。 2. 如果不怕踩坑,也可以试试 podman ,它提供--squash-all 选项构建干净系统。 3. 最后可以试试 docker export 导出合并后的文件系统,基于这个再重新构建,设置好环境变量。 |
4
ETiV 9 天前 via iPhone 1
你要想镜像小就 multi-stage ,在最后一步把需要的东西 copy 出来,中间有多个 RUN 也无妨,还会最大化利用到缓存
不过纯静态 build 一个可执行程序的话,我一般都单独用它,不会再给它放进 docker image 里… |
5
Ipsum 9 天前
兄弟,你把编译环境一起打包了?应该编译和 bin 分开,编译好了直接 copy 到运行环境中
|
6
Tiller 9 天前
你运行之后,进去看一下哪些文件比较大就知道了。
我之前试过一个镜像 1g 多。我都震惊了 慢慢排查,发现怎么随着版本更新,越来越大了呢? 从半年前的 200m 渐渐变成 1g 多。 我对前端的打包流程也不懂,就请教了大佬。他们最后发现,CI/CD 流程出问题了。。。每次打包的临时文件全都放进去了。 最后每次构建之前删掉临时文件就恢复正常了。 |
7
povsister 9 天前
不用 multi stage 就是一个 run 一层,你数一下你有多少个 run 吧
|
8
wnpllrzodiac 9 天前 via Android
apt 缓存清一下。分 stage,build 后把二进制拷贝到发布 image 最干净
|
9
mayli 9 天前
最简单办法,把所有命令串起来放到一个 run 里,就小了
|
10
qq296015668 8 天前
改好了
``` 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"] ``` |