Files
TERES_web_frontend/Dockerfile

77 lines
1.7 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 多阶段构建 - 构建阶段
FROM node:20-alpine AS builder
# 接受构建参数
ARG BUILD_MODE=production
WORKDIR /app
# 复制包管理文件
COPY package.json pnpm-lock.yaml ./
# 安装 pnpm 和依赖
RUN npm install -g pnpm && pnpm install
# 复制源代码
COPY . .
# 根据构建模式复制对应的环境文件
RUN if [ "$BUILD_MODE" = "flask" ]; then \
cp .env.flask .env; \
else \
cp .env.production .env; \
fi
# 根据构建模式执行对应的构建命令
RUN if [ "$BUILD_MODE" = "flask" ]; then \
pnpm build:flask; \
else \
pnpm build; \
fi
# 生产阶段 - nginx
FROM nginx:alpine AS production
# 接受端口参数默认为5173
ARG PORT=5173
# 复制自定义 nginx 配置
RUN cat > /etc/nginx/conf.d/default.conf << EOF
server {
listen ${PORT};
server_name localhost;
root /usr/share/nginx/html;
index index.html;
# 处理 SPA 路由
location / {
try_files \$uri \$uri/ /index.html;
}
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
}
EOF
# 从构建阶段复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 暴露端口(使用构建时指定的端口)
EXPOSE ${PORT}
# 启动 nginx
CMD ["nginx", "-g", "daemon off;"]