至于写还是不写,看团体吧,我团体普通不写,由于我在项目启动命令会指定项目端口,启动容器的时分映射出来就好,这样我就要维护一个中央,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 命令装依赖的时分,大部分时分我们只是改代码,依赖不变,这时分假设可以让这一步缓存起来,依赖没有变化的时分,就不需求重新装依赖,就可以大大改良编译速度。
前面我们说了镜像构建时,是一层层构建,前一层是后一层的基础,既然是这样的话,我们就把 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 字眼,细心看下图可以看到。
充沛应用 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)