Commit d88d585d by 王宝涛

refactor(docker): 添加Docker部署配置并优化文件忽略规则

- 添加.dockerignore文件忽略不必要的文件和目录
- 添加docker-compose.yml配置服务构建和运行参数
- 添加Dockerfile实现多阶段构建优化镜像大小
- 添加nginx.conf配置支持Vue Router历史模式和静态资源缓存
- 修改.gitignore添加日志文件忽略规则
- 修复组件导入路径中的命名大小写问题
parent d3f793ed
node_modules
dist
.git
.gitignore
README.md
.env.local
.env.*.local
.vscode
.idea
*.log
.DS_Store
coverage
.nyc_output
......@@ -39,3 +39,5 @@ jinayi
/src/api/jianyi
/src/views/code/demo3
.history
*.log
# ==========================================
# 阶段 1: 构建环境 (Builder)
# ==========================================
# 使用指定的 Node 22.22.0 版本
FROM node:22.22.0-alpine AS builder
# 设置工作目录
WORKDIR /app
# 安装 pnpm
# Alpine 镜像通常没有 pnpm,需要通过 corepack 启用或 npm 全局安装
# Node 22 默认内置 corepack,推荐以下方式启用 pnpm
RUN corepack enable && corepack prepare pnpm@latest --activate
# 复制 package.json 和 pnpm-lock.yaml (利用 Docker 缓存层)
COPY package.json pnpm-lock.yaml ./
# 安装依赖
# --frozen-lockfile 确保安装版本与锁文件严格一致,适合生产环境
RUN pnpm install --frozen-lockfile
# 复制所有源代码
COPY . .
# 执行构建命令 (假设你的构建脚本是 build,输出到 dist 目录)
RUN pnpm run build
# ==========================================
# 阶段 2: 生产环境 (Production)
# ==========================================
# 使用轻量级 Nginx 镜像
FROM nginx:alpine AS production
# 设置工作目录
WORKDIR /usr/share/nginx/html
# 从 builder 阶段复制构建好的 dist 目录内容到 Nginx 静态目录
# 注意:Vue 3 + Vite 默认输出到 dist/,如果是 webpack 可能是 dist/ 或其他
COPY --from=builder /app/dist .
# 复制自定义的 Nginx 配置文件 (可选,但推荐用于解决 Vue Router History 模式刷新 404 问题)
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露端口
EXPOSE 8052
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
services:
vue-app:
build:
context: .
dockerfile: Dockerfile
image: xjrsoft-vue:1.0.0
container_name: xjrsoft-vue
ports:
- "8052:8052"
restart: unless-stopped
server {
listen 8052;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
# 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;
# 缓存静态资源
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# Vue Router history模式支持
location / {
try_files $uri $uri/ /index.html;
}
# 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
}
......@@ -118,7 +118,7 @@
import ApprovalProcess from '/@/views/workflow/task/components/ApprovalProcess.vue';
import { getFormExecuteWorkflow } from '/@/api/form/execute';
import MesProcessPlErrorModal from './components/MesProcessPlErrorModal.vue';
import MesProcessPlErrorModal from './components/MesProcessPLErrorModal.vue';
import propsModal from '../mesprocessplerror/components/propsModal.vue';
import { searchFormSchema, columns } from './components/config';
import Icon from '/@/components/Icon/index';
......
......@@ -58,7 +58,7 @@
import { useModal } from '/@/components/Modal';
import ProOrderWorkStepModal from './components/ProOrderWorkStepModal.vue';
import ProOrderWorkStepModal from './components/ProorderworkstepModal.vue';
import { searchFormSchema, columns } from './components/config';
import Icon from '/@/components/Icon/index';
......
......@@ -59,7 +59,7 @@
import { useModal } from '/@/components/Modal';
import WhStockModal from './components/WhStockModal.vue';
import WhStockModal from './components/WhstockModal.vue';
import { downloadByData } from '/@/utils/file/download';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment