[eggjs/egg]如何优化基于eggjs打包的docker镜像大小?

2024-03-29 729 views
0

基于eggjs的官方Dockerfile,其中基础镜像node:8.11.3-alpine -> node:14.0-alpine3.10,打包出来的docker镜像大小为323MB:

# docker images | grep egg
egg-boilerplate                                      latest              d68f1d4b3ff7        7 seconds ago       323MB

node:14.0-alpine3.10的镜像大小为116MB:

# docker images | grep node
node                                                 14.0-alpine3.10     cedae5e6c15d        2 weeks ago          116MB

eggjs相关的应用大小为200M+,有没有优化镜像大小的方案?

回答

6

是 node_modules 占了比较大的空间吧?

9

是的,我也要遇到这个情况,我是把开发和生产的依赖包分别安装到dependencies与devDependencies; 比如: "dependencies": { "egg": "^2.6.1", "egg-scripts": "^2.6.0" }, 上生产的时候执行命令npm install --production安装后的包就只有30M+,然后镜像源走的是私服NPM,是否有更好的方案解决包体积与速度的优化?

9

改了下Dockerfile,打出来的镜像变小了,为198MB:

docker images | grep egg
egg-boilerplate                                      latest              efeac5d7b68d        7 minutes ago       198MB

node_modules大小为33.7M:

/usr/src/app #  du -sh node_modules/
33.7M   node_modules/

还有大概48M(198M - 33.7M - 116M)的大小不知道在哪里。

0

@ErikXu 执行下 docker history 看下每个 layer 的大小,看看是哪一层的空间大

0

@hyj1991 npm i --production最大,80.6M:

docker history egg-boilerplate
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
efeac5d7b68d        6 hours ago         /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "npm …   0B
3f2f9db73e5c        6 hours ago         /bin/sh -c #(nop)  EXPOSE 7001                  0B
2db63329d091        6 hours ago         /bin/sh -c #(nop) COPY dir:060897d68c8c58712…   5.32kB
f30e01b96bbf        6 hours ago         /bin/sh -c npm i --production                   80.6MB
cd7cf42a0183        8 days ago          /bin/sh -c #(nop) COPY file:3979f18b413275db…   1.14kB
6f7082762979        3 weeks ago         /bin/sh -c #(nop) WORKDIR /usr/src/app          0B
9ac72c071f2b        3 weeks ago         /bin/sh -c mkdir -p /usr/src/app   && apk ad…   1.34MB
6dc17513c0c2        3 weeks ago         /bin/sh -c #(nop)  ENV TIME_ZONE=Asia/Shangh…   0B
cedae5e6c15d        3 weeks ago         /bin/sh -c #(nop)  CMD ["node"]                 0B
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>           3 weeks ago         /bin/sh -c #(nop) COPY file:238737301d473041…   116B
<missing>           3 weeks ago         /bin/sh -c apk add --no-cache --virtual .bui…   7.62MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV YARN_VERSION=1.22.4      0B
<missing>           3 weeks ago         /bin/sh -c addgroup -g 1000 node     && addu…   103MB
<missing>           3 weeks ago         /bin/sh -c #(nop)  ENV NODE_VERSION=14.0.0      0B
<missing>           3 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           3 months ago        /bin/sh -c #(nop) ADD file:d48cac34fac385cbc…   5.56MB
4

@ErikXu 那没啥好办法吧。。。除非你构建的时候不 install,CMD 改成 npm install && start xxx

2

可以用来multistage 构建,构建在另外一个镜像里,怀疑是 tmp 文件占用空间

0

挖坟贴....

最近有个项目需要生成 Docker 镜像,我总结下我的实践方式。

  • 多阶段构建 ( multistage builds )。

前、后端只取最终的产物

  • alpine:latest,单独安装 nodejsyarnbash 即可。npmyarn 2 选 1 即可。

我对比尝试了一下,这样构建出来的基础镜像比直接使用 node:16.8.0-alpine3.11 是小的。

  • 清理缓存:RUN yarn install --production && yarn cache clean

记得清理 yarnnpm 的安装缓存。缓存占据的空间也是很多的。

  • node_mudules 进行瘦身

我采用了 node-prune 删除了 node_mudules 中不必要的文件。这一步我这里减少了 20 ~ 30M。另外还有 2 个方法: ① tj 的 node-pruneyarn cache clean

上述处理完成后,前、后端的总大小维持在 156M 左右。效果还是不错的。

image