首页 > 解决方案 > NestJS 最小化 dockerfile

问题描述

我想码头化我的nestjs api。使用下面列出的配置,图像变得 319MB 大。有什么比多阶段更简单的减小图像大小的方法?

Dockerfile

FROM node:12.13-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
CMD npm start

.dockerignore

.git
.gitignore
node_modules/
dist/

标签: dockerdockerfilenestjs

解决方案


为了减小 docker 图像大小,您可以使用

  1. 多阶段构建
  2. Npm 修剪

使用多阶段构建时,您应该有 2(或更多)个 FROM 指令,像往常一样,第一阶段确实构建,第二阶段只是从第一个临时层复制构建并具有运行应用程序的指令。在我们的例子中,我们应该复制 dist 和 node_modules 目录。

第二个重要时刻是正确拆分 package.json 文件中“devDependencies”和“dependencies”之间的依赖关系。

在第一阶段安装 deps 后,您应该使用 npm prune --production 从节点模块中删除 devDependencies。

FROM node:12.14.1-alpine AS build


WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . ./

RUN npm run build && npm prune --production


FROM node:12.14.1-alpine

WORKDIR /app
ENV NODE_ENV=production

COPY --from=build /app/dist /app/dist
COPY --from=build /app/node_modules /app/node_modules

EXPOSE 3000
ENTRYPOINT [ "node" ]
CMD [ "dist/main.js" ]

如果您在使用 node-gyp 时遇到问题或只是想看看 - 一个完整的示例,其中包含此要点中的注释:

https://gist.github.com/nzvtrk/cba2970b1df9091b520811e521d9bd44

更多有用的参考资料:

https://docs.docker.com/develop/develop-images/multistage-build/

https://docs.npmjs.com/cli/prune


推荐阅读