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

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

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

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

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

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

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

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

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

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

最后每次构建之前删掉临时文件就恢复正常了。
povsister
52 天前
不用 multi stage 就是一个 run 一层,你数一下你有多少个 run 吧
wnpllrzodiac
52 天前
apt 缓存清一下。分 stage,build 后把二进制拷贝到发布 image 最干净
mayli
52 天前
最简单办法,把所有命令串起来放到一个 run 里,就小了
qq296015668
51 天前
改好了
```
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"]
```

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

https://tanronggui.xyz/t/1096825

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

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

© 2021 V2EX