NestJS 最小化 dockerfile

dew*_*wey 5 docker dockerfile nestjs

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

文件

FROM node:12.13-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
CMD npm start
Run Code Online (Sandbox Code Playgroud)

.dockerignore

.git
.gitignore
node_modules/
dist/
Run Code Online (Sandbox Code Playgroud)

小智 8

为了减少泊坞窗图像大小,您可以使用

  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" ]
Run Code Online (Sandbox Code Playgroud)

如果您在使用 node-gyp 时遇到问题,或者只是想看看 - 一个完整的例子,在这个要点中有注释:

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

更多有用的参考资料:

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

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