# 优化打包、速度

WARNING

Docker 的层用于保存镜像的上一版本和当前版本之间的差异。就像 Git 的提交一样,如果你与其他存储库或镜像共享它们,就会很方便。

# 镜像是有很多层

TIP

大家在定义 Dockerfile 时,如果太多的使用 RUN 指令,经常会导致镜像有特别多的层,镜像很臃肿,而且甚至会碰到超出最大层数(127层)限制的问题,遵循 Dockerfile 最佳实践,我们应该把多个命令串联合并为一个 RUN(通过运算符&&和/ 来实现),每一个 RUN 要精心设计,确保安装构建最后进行清理,这样才可以降低镜像体积,以及最大化的利用构建缓存。

当前并不是只使用一条RUN的指令就好

构建业务服务镜像技巧

Docker 在 build 镜像的时候,如果某个命令相关的内容没有变化,会使用上一次缓存(cache)的文件层,在构建业务镜像的时候可以注意下面三点。

  • 不变或者变化很少的体积较大的依赖库和经常修改的自有代码分开。
  • 因为 cache 缓存在运行 Docker build 命令的本地机器上,建议固定使用某台机器来进行 Docker build,以便利用 cache。
  • 用好缓存和基础镜像, 经常变更的层放后面。

# dockerfile 构建技巧

TIP

  • 多阶段构建、如npm i 单独构建。
  • npm 的时候 npm install —production (部分项目全部node_modules都下载下来了)。
  • .dockerignore忽略一些生产环境的代码执行没有帮助的。(如:test .gitlab-ci.yml 等等,我试验过,大约可以减少5M体积。)

# 来个简单的示例

FROM node:10-alpine

WORKDIR /usr/src/app

RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata \
    && mkdir -p /usr/src/app

# add npm package
COPY package.json /usr/src/app/package.json

RUN npm i --production --registry=https://registry.npm.taobao.org

# copy code
COPY . /usr/src/app

EXPOSE 7001

CMD npm start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
最近更新: 9/22/2022, 5:59:36 AM