您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    如何优化 Node 项目的 Docker 镜像(2)
    时间:2021-08-09 08:05 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    至于写还是不写,看团体吧,我团体普通不写,由于我在项目启动命令会指定项目端口,启动容器的时分映射出来就好,这样我就要维护一个中央,Dockerfile 也写了的话,项目端口变了,这里也要修正,多了点维护成本,当然也有办法让两边端口变量取自配置文件,只需改配置文件即可。

    下面是改写后的 Dockerfile。

    FROM alpine:latest 

     

    # 运用 apk 命令安装 nodejs 和 yarn,假设运用 npm 启动,就不需求装 yarn 

    RUN apk add --no-cache --update nodejs=14.17.4-r0 yarn=1.22.10-r0 

     

    # 暴露端口 

    EXPOSE 4300 

     

    # 设置环境变量 

    ENV NODE_ENV=production \ 

    APP_PATH=/node/app 

     

    # 设置任务目录 

    WORKDIR $APP_PATH 

     

    # 把以后目录下的一切文件拷贝到镜像的任务目录下 .dockerignore 指定的文件不会拷贝 

    COPY . $APP_PATH 

     

    # 安装依赖 

    RUN yarn 

     

    # 启动命令 

    CMD yarn start 

    这一步的优化,无论从镜像大小还是构建镜像速度都看不到清楚的差别,由于改动的层内容少(表现不出来),但是可以查看到镜像的层是变少了的,可以自行试试查看镜像的层试试。

    增加镜像层数是“好老板”的传统优秀习气,不让“员工”糜费资源。

    package.json 提早提高编译速度

    从下图可以看到每次我们 build 的时分最耗时的就是在执行 yarn 命令装依赖的时分,大部分时分我们只是改代码,依赖不变,这时分假设可以让这一步缓存起来,依赖没有变化的时分,就不需求重新装依赖,就可以大大改良编译速度。

    如何优化 Node 项目的 Docker 镜像

    前面我们说了镜像构建时,是一层层构建,前一层是后一层的基础,既然是这样的话,我们就把 package.json 文件独自提早拷贝到镜像,然后下一步装依赖,执行命令装依赖这层的前一层是拷贝 package.json 文件,由于安装依赖命令不会变化,所以只需 package.json 文件没变化,就不会重新执行 yarn 安装依赖,它会复用之前安装好的依赖,原理讲清楚了,下面我们看效果。

    改动后的 Dockerfile 文件:

    FROM alpine:latest 

     

    # 运用 apk 命令安装 nodejs 和 yarn,假设运用 npm 启动,就不需求装 yarn 

    RUN apk add --no-cache --update nodejs=14.17.4-r0 yarn=1.22.10-r0 

     

    # 暴露端口 

    EXPOSE 4300 

     

    # 设置环境变量 

    ENV NODE_ENV=production \ 

    APP_PATH=/node/app 

     

    # 设置任务目录 

    WORKDIR $APP_PATH 

     

    # 拷贝 package.json 就任务跟目录下 

    COPY package.json . 

     

    # 安装依赖 

    RUN yarn 

     

    # 把以后目录下的一切文件拷贝到镜像的任务目录下 .dockerignore 指定的文件不会拷贝 

    COPY . . 

     

    # 启动命令 

    CMD yarn start 

    build 看下图,编译时间从 29.6s 到 1.3s,运用了缓存的层前面会有个 CACHED 字眼,细心看下图可以看到。

    如何优化 Node 项目的 Docker 镜像

    充沛应用 Docker 缓存特性是优化构建速度的利器。

    运用多阶段构建再次压榨镜像大小

    多阶段构建这里不多说了,不了解的可以先搜相关材料了解。

    由于我们运转 Node 顺序时只需求消费的依赖和最终 Node 可以运转的文件,就是说我们运转项目只需求 package.js 文件里 dependencies 里的依赖,devDependencies 依赖只是编译阶段用的,比如 eslint 等这些工具在项目运转时是用不到的,再比如我们项目是用 typescript 写的,Node 是不能直接运转 ts 文件,ts 文件需求编译成 js 文件,运转项目我们只需求编译后的文件和 dependencies 里的依赖就可以运转,也就是说最终镜像只需求我们需求的东西,任何其他东西都可以删掉,下面我们运用多阶段改写 Dockerfile。

    # 构建基础镜像 

    FROM alpine:3.14 AS base 

     

    # 设置环境变量 

    ENV NODE_ENV=production \ 

        APP_PATH=/node/app 

     

    # 设置任务目录 

    WORKDIR $APP_PATH 

     

    # 安装 nodejs 和 yarn 

    RUN apk add --no-cache --update nodejs=14.17.4-r0 yarn=1.22.10-r0 

     

    # 运用基础镜像装依赖阶段 

    FROM base AS install 

     

    # 拷贝 package.json 就任务跟目录下 

    COPY package.json ./ 

     

    # 安装依赖 

    RUN yarn 

     

    # 最终阶段,也就是输入的镜像是这个阶段构建的,前面的阶段都是为这个阶段做铺垫 

    FROM base 

     

    # 拷贝 装依赖阶段 生成的 node_modules 文件夹就任务目录下 

    COPY --from=install $APP_PATH/node_modules ./node_modules 

     

    # 将以后目录下的一切文件(除了.dockerignore扫除的途径),都拷贝进入镜像的任务目录下 

    COPY . . 

     

    # 启动 

    CMD yarn start 

    (责任编辑:admin)