# 优化打包、速度
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21