面试题答案
一键面试构建时间长优化策略
- 利用缓存机制:
- npm缓存:在构建镜像时,将
node_modules
目录作为缓存挂载。在Dockerfile中,可以使用如下指令:
- npm缓存:在构建镜像时,将
# 缓存npm依赖
RUN npm install --cache /root/.npm --prefer-offline
这样,在后续构建中,如果package.json
和package - lock.json
没有变化,npm安装过程会直接使用缓存,大大加快安装速度。
- Angular CLI缓存:Angular CLI自6.0版本起支持构建缓存。在项目根目录下运行
ng build -- --cache - true
,构建工具会缓存构建过程中的中间结果,下次构建时如果源文件没有变化,会复用缓存,加快构建。在CI/CD流程中,可以将这个命令集成到构建脚本中。
- 并行构建:对于多核CPU的构建环境,可以利用并行构建的方式。例如,在
package.json
的scripts
中定义并行构建脚本,如使用concurrently
工具同时运行多个构建任务(如果项目有多个Angular应用或模块可以并行构建):
"scripts": {
"build:parallel": "concurrently \"ng build app1\" \"ng build app2\""
}
镜像体积大优化策略
- 精简基础镜像:
- 选择体积小的基础镜像,例如使用
node:alpine
替代node:latest
。alpine
是一个轻量级的Linux发行版,体积小很多。修改Dockerfile的基础镜像:
- 选择体积小的基础镜像,例如使用
FROM node:alpine
- 清理不必要文件:
- npm安装后清理:在npm安装依赖后,清理npm缓存和不必要的文件。在Dockerfile中添加如下指令:
RUN npm install && npm cache clean --force && rm -rf /root/.npm
- 构建产物清理:只保留最终部署需要的文件,例如在Angular构建后,只将
dist
目录下的内容复制到镜像中,而不是整个项目目录。
COPY dist/my - angular - app /app
在CI/CD流程中结合优化措施
- 构建阶段:
- 在CI(如使用GitHub Actions、GitLab CI/CD等)中,配置构建步骤以利用上述优化策略。例如,在GitHub Actions的工作流文件(
.github/workflows/build - deploy.yml
)中:
- 在CI(如使用GitHub Actions、GitLab CI/CD等)中,配置构建步骤以利用上述优化策略。例如,在GitHub Actions的工作流文件(
name: Build and Deploy Angular App
on:
push:
branches:
- main
jobs:
build:
runs - on: ubuntu - latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup - node@v2
with:
node - version: '14'
- name: Cache npm dependencies
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.os }} - ${{ hashFiles('package.json', 'package - lock.json') }}
restore - keys: |
${{ runner.os }} -
- name: Install dependencies
run: npm install --prefer - offline
- name: Build Angular app with cache
run: ng build -- --cache - true
- name: Create Docker image
env:
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t my - angular - app:${IMAGE_TAG}.
- 部署阶段:
- 在CD过程中,确保使用优化后的镜像进行部署。例如,如果使用Kubernetes进行部署,更新
deployment.yml
文件中的镜像标签为最新构建的优化镜像:
- 在CD过程中,确保使用优化后的镜像进行部署。例如,如果使用Kubernetes进行部署,更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: my - angular - app - deployment
spec:
replicas: 3
selector:
matchLabels:
app: my - angular - app
template:
metadata:
labels:
app: my - angular - app
spec:
containers:
- name: my - angular - app
image: my - angular - app:${IMAGE_TAG}
ports:
- containerPort: 80