# ============================================================= # 寄卖商城 管理后台前端 (Vue 2 / Vue CLI 4) # build context = single-shop-22/backend-adminend # 多阶段: Node 构建 -> Nginx 运行;可通过 ARG VUE_APP_BASE_API 注入 API 域名 # # 想直接使用源码里已有的 dist/: 用 --target=fast 构建 # ============================================================= # syntax=docker/dockerfile:1.6 # ---------- 构建阶段(默认) ---------- FROM node:16-alpine AS builder # 留空(默认)→ 浏览器走与 nginx 同域的 /api/;填具体 URL 则直连后端 ARG VUE_APP_BASE_API="" ENV NODE_OPTIONS=--openssl-legacy-provider \ NPM_CONFIG_REGISTRY=https://registry.npmmirror.com WORKDIR /app COPY package.json yarn.lock* package-lock.json* ./ RUN (yarn install --frozen-lockfile 2>/dev/null) || npm ci || npm install --legacy-peer-deps COPY . . # 覆盖 .env.production,使用 build arg RUN printf "ENV='production'\nVUE_APP_BASE_API=%s\n" "$VUE_APP_BASE_API" > .env.production \ && npm run build:prod # ---------- 运行阶段 ---------- FROM nginx:1.25-alpine AS runtime ENV TZ=Asia/Shanghai RUN apk add --no-cache tzdata \ && cp /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone COPY --from=builder /app/dist /usr/share/nginx/html RUN cat > /etc/nginx/conf.d/default.conf <<'NGX' server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; client_max_body_size 50m; add_header X-Frame-Options SAMEORIGIN always; location ~* \.(?:js|css|png|jpg|jpeg|gif|svg|woff2?|ttf|map)$ { expires 30d; add_header Cache-Control "public, max-age=2592000, immutable"; try_files $uri =404; } # 反代到管理后台 API location /api/ { proxy_pass http://single-admin-api:30032/api/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 120s; client_max_body_size 50m; } # CRMEB 部分接口直接命中 /adminapi (兼容) location /adminapi/ { proxy_pass http://single-admin-api:30032/adminapi/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { try_files $uri $uri/ /index.html; } } NGX EXPOSE 80 # ---------- 备选: 直接复用源码已构建的 dist/(fast 模式) ---------- # 构建命令: docker compose build --target fast single-admin-web FROM nginx:1.25-alpine AS fast ENV TZ=Asia/Shanghai RUN apk add --no-cache tzdata \ && cp /usr/share/zoneinfo/$TZ /etc/localtime \ && echo $TZ > /etc/timezone COPY dist/ /usr/share/nginx/html COPY --from=runtime /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf EXPOSE 80