1
startisan 2021-12-14 16:21:13 +08:00
直接搞成一层吧
docker create --name xxx 镜像名 docker export xxx | docker import - 新镜像名 |
2
ss098 2021-12-14 16:23:09 +08:00
第二点问题的解决方案是(不一定是最优解,但我知道可行),在同一条命令中:
1. 获取数据,比如在容器内从外部 wget 什么的,不要用 COPY 指令 2. 执行安装 3. 删除所有不需要的文件 |
3
dolphintwo 2021-12-14 16:24:15 +08:00
简单办法:第一个镜像构建,不用在意层数,第二个镜像只拷贝第一个镜像中必要运行环境
|
4
rationa1cuzz OP @startisan 强啊兄弟
@ss098 我是离线安装,没办法使用 wget ,有办法不适用 copy 吗? @dolphintwo 我不知道哪些是必要环境,装了很多 rpm 包 还要编译同事给源码包,copy --from=build1 / / (这个可以吗) |
5
Rheinmetal 2021-12-14 18:58:25 +08:00
优化需要更详细的信息
语言 框架 现有 base image 一种通用方法是 alpine 做 base image 然后全部静态编译 某些语言和框架不一定适用 不是 glibc 可能会带来问题 一个个人前端项目折腾了很多 用 yarn 做 base image 仅 copy packages.json npm install 做成 builder 如果依赖不更新这一步直接用缓存 复制剩下的代码构建 artifact 放到 alpine 底包的 node 镜像 做到 总体积十几个 m 更新代码只需 1m 左右 不改依赖用 vite 构建一次几十秒 |
6
arischow 2021-12-14 19:10:33 +08:00
多阶段构建用上了吗?用上的话最后的镜像大小应该 == 编译后包大小吧?
|
7
Rheinmetal 2021-12-14 19:11:12 +08:00
为啥要优化镜像大小
原因决定方向 为了更新快的话 1L 的一勺烩方案不一定合适 多层设计就可以做到依赖不动 只更新代码 底包不动只更新依赖和代码 |
8
noqwerty 2021-12-14 20:41:58 +08:00 via Android
第一点可以尝试一下 DOCKER_BUILDKIT=1 docker build .,不会生成多余的 intermediate layer
|
9
rationa1cuzz OP @Rheinmetal 感谢,暂时的需求是做出来的镜像太大,只需要用相对简单一点方法变小就行,后面如果有更多需求可以按你这个来。
@arischow 还没,因为我菜,加上包有离线 rpm 包,有 glibc ,所以一时间不知道怎么写--from 参数 @noqwerty 感谢,我试试 @startisan 老哥你这有坑啊,export 是根据 container 生成的,会丢失 docker file 中的 run 命令,需要注意 |
10
Rheinmetal 2021-12-15 09:29:30 +08:00
@Rheinmetal
glibc 的话 是不是直接静态编译? |
11
rationa1cuzz OP @Rheinmetal 没有默认的应该是动态编译,没加-static
|