【问题标题】:NestJS minimize dockerfileNestJS 最小化 dockerfile
【发布时间】:2020-07-19 10:52:10
【问题描述】:

我想码头化我的 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 dockerfile nestjs


    【解决方案1】:

    为了减小 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 时遇到问题,或者只是想看看 - 此要点中包含 cmets 的完整示例:

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

    更多有用的参考资料:

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

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

    【讨论】:

    • 也许将 COPY --from=build /app/dist /app/dist COPY --from=build /app/node_modules /app/node_modules 的顺序更改为 COPY --from 是有意义的=build /app/node_modules /app.node_modules COPY --from=build /app/dist /app/dist 所以改变最少的 node_modules 优先,使用 docker 缓存,构建效率更高?
    猜你喜欢
    • 2020-04-17
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    相关资源
    最近更新 更多