距离上一次更新该文章已经过了 473 天,文章所描述的內容可能已经发生变化,请留意。
记录一次node项目优化方案
优化前:
- 以ubuntu发行版为基础镜像
- 不带小版本号
- 每次构建都从头构建(这里也推荐将package*json先copy过来进行install再copy . .,如果文件没变化,那就使用缓存,不重新构建)
优化后:
- 建立runtime基础镜像(包含提前安装好的基础依赖和环境, 包括node_modules),并使用alpine为基础镜像发行版
- 使用nexus管理项目包(docker/npm/maven)
- 指定具体版本号(只有 major version,没有指定 minor version、patch version。当该基础镜像 minor 或 patch 版本更新后,如果本地的镜像缓存也被清除了,那么打包就会使用新版本的基础镜像)
- 构建 Docker 镜像的时候,会缓存 Dockerfile 中尚未更改的所有步骤。所以,如果新构建时更改任何指令,将后的指令步骤将会重新来不再使用缓存。举例来说,就是指令 3 发生了变更,其后的 4-n 就会重跑并重新生成缓存。
因此,编写 Dockerfile 的时候,就需要将最不可能产生更改的指令放在前面。比如,可以把 WORKDIR/ENV 等命令放在前面,COPY/ADD 等命令放在后面。这样,在构建过程中较多的使用了缓存,就可以节省很多时间了。 - 多阶段构建,以减小镜像体积(多阶段构建会减慢构建速度, 可以参考加快多阶段构建速度篇)
- .dockerignore(排除那些容器运行时不需要的文件;排除那些不会在构建过程中[这里更多指copy和add的时候]使用的中间文件)plaintext
1
2
3
4
5
6
7package.json
package-lock.json
node_modules
.gitlab-ci.yml
deployment.yaml
Dockerfile
.gitignore
dockerfile例子
dockerfile
1 | # 这里还需要注意ARG在from之前,那就只能用在from指令上,而且如果有变动则后续都无法使用缓存 |
补记:配置加速源
腾讯云主机建议优先考虑配置 https://mirror.ccs.tencentyun.com
sh
1 | vim /etc/docker/daemon.json |
- 科大镜像【不推荐】:https://docker.mirrors.ustc.edu.cn
- 网易:https://hub-mirror.c.163.com
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 腾讯云:https://mirror.ccs.tencentyun.com
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!