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

11 小时 36 分钟前
 qazwsxkevin
```
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 编译完成,就这么大?
720 次点击
所在节点    问与答
9 条回复
Orenoid
11 小时 30 分钟前
大概率是因为删除构建工具和临时文件这一层,这样是无效的,它只是在这一层把文件标记为删除,要真正删除必须在同一层用 && 执行
nagisaushio
11 小时 23 分钟前
建议二阶段构建,只拷贝编译完的东西过来
sagaxu
11 小时 16 分钟前
docker 的存储是分层的,你每一个 RUN 之后的文件系统都会保留快照,即使最后一个 RUN 是 rm -fr /,中间每一层也都会存储下来占用空间。

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

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

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

不过纯静态 build 一个可执行程序的话,我一般都单独用它,不会再给它放进 docker image 里…
Ipsum
10 小时 44 分钟前
兄弟,你把编译环境一起打包了?应该编译和 bin 分开,编译好了直接 copy 到运行环境中
Tiller
9 小时 49 分钟前
你运行之后,进去看一下哪些文件比较大就知道了。

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

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

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

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

最后每次构建之前删掉临时文件就恢复正常了。
povsister
9 小时 31 分钟前
不用 multi stage 就是一个 run 一层,你数一下你有多少个 run 吧
wnpllrzodiac
8 小时 32 分钟前
apt 缓存清一下。分 stage,build 后把二进制拷贝到发布 image 最干净
mayli
3 分钟前
最简单办法,把所有命令串起来放到一个 run 里,就小了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1096825

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX