docker - 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/
解决方案
为了减小 docker 图像大小,您可以使用
- 多阶段构建
- 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/
推荐阅读
- c# - 如何在 FlowLayoutPanel 中查找标签
- algebra - 为什么 Y(O_Y) 的层,作为 X 的一个封闭子方案,不一定是仿射的,是准相干的?
- java - 从命令行调用jar的lib文件夹中的jar类?
- php - 尝试使用 Codeigniter 从 JSON 保存数据时找不到对象
- shell - 使用 Unix shell 脚本的 FTP,然后触发任务
- python - 我想用 start 命令运行我的 python 程序(不是脚本),这是要执行的 python 程序文件中的一种方法
- php - ManyToMany关系连接三个表,结果限制了mysql中第三个表的第三个表限制
- java - com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 键 'PRIMARY' 的重复条目 '0'] 有根本原因
- c# - 单击 VR 中的游戏对象并做某事
- powershell - 有什么方法可以更改 Powershell ISE 的突出显示颜色?