如何减小 Dcoker 镜像的体积呢?

多阶段构建的镜像,第二阶段只安装了 hook-kit 这一个包

build 完,
整个镜像 4.08 G
进入bash看 node_modules,大小是 1.9G

请教两个问题:

  1. 我电脑安装同样的包,大小只有 560 M,为什么镜像里安装就 1.9G 呢
  2. 为什么 node_modules 1.9G,整个镜像却 4G 呢?

大佬们,帮帮 Docker 新手吧~~~
有需要的话,我可以把镜像传到 DockerHub 上去

感谢感谢~~~


Dockerfile 如下
image.png

阅读 2.5k
4 个回答
  1. 除了 node_modules 之外,你需要检查一下其它的 2G 文件在哪里。
  2. 你最好是换一种构建方式,你这种启动方式必须要保留 node_modules,更好的方式应该是先打包,获得 dist 部署文件,然后部署到 nginx,这样镜像就非常小了,你现在这样打包至少都会有 2G 以上,吃力不讨好。
你使用了多阶段构建,那么只要部署 dist 就可以了,可以在第二阶段使用 nginx 镜像

楼上+1,不打包丢modules是啥玩法?

我的工作场景中对于部署文件大小要求比较高,下面是我这几年一直以来的做法

  1. 只要不是服务端依赖的包全部放到dev依赖下
  2. 不要在docker内打包,需要在外面打包好,只把dist结果 以及 prod依赖的node_modules, COPY进去
  3. 不使用node镜像,换用ubuntu镜像 + node 执行文件

试试你的项目能用@vercel/ncc 成功bundle不?
能的话就不需要拷贝node_modules目录了,大大减小了docker镜像大小。另外你也可以考虑使用alpine基础镜像来缩减镜像容量。

我的dockerfile你可以参考:

FROM node:16-alpine as builder

COPY . /usr/src/app/
RUN --mount=type=cache,target=/root/.npm/ \
    cd /usr/src/app/ && \
    npm ci -dd && \
    npm run build

FROM node:16-alpine

COPY --from=0 /usr/src/app/dist/ /usr/src/app/
ENV FASTIFY_PORT=3006
ENV FASTIFY_ADDRESS=0.0.0.0
EXPOSE ${FASTIFY_PORT}

RUN adduser -s /bin/false -S -D -H app
USER app

CMD ["node", "/usr/src/app/index.js"]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题