You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Caddy容器覆盖Frontend容器文件:静态资源服务异常求助

问题排查与解决

核心问题分析

出现该现象的原因主要有两点:

  1. 卷初始化顺序冲突:Caddy容器启动时会自动在/usr/share/caddy生成默认index.html页面,由于共享卷frontend_build是双向同步的,Caddy先启动时会将自带页面写入卷,导致后续启动的Frontend容器挂载该卷后,/app/dist被Caddy的默认文件覆盖。
  2. Frontend镜像可能未生成有效构建产物:如果Frontend镜像在构建时未执行npm run build,或产物路径不是/app/dist,挂载卷后自然没有站点文件,反而被Caddy的内容填充。

具体解决步骤

1. 调整容器启动顺序,确保Frontend先写入构建产物

修改docker-compose.yml,给Frontend添加健康检查,让Caddy等待Frontend的构建产物就绪后再启动:

services:
  frontend:
    image: hashirayaz/rehaish_frontend:latest
    container_name: frontend_container
    volumes:
      - frontend_build:/app/dist
    environment:
      - VITE_BACKEND_URL=${VITE_BACKEND_URL}
    networks:
      - default
    depends_on:
      - backend
    labels:
      - com.centurylinklabs.watchtower.enable=true
    # 健康检查:确认dist目录存在index.html
    healthcheck:
      test: ["CMD", "test", "-f", "/app/dist/index.html"]
      interval: 3s
      timeout: 5s
      retries: 10

  caddy:
    image: caddy
    container_name: caddy_container
    ports:
      - "8080:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - frontend_build:/usr/share/caddy  
    restart: always
    networks:
      - default
    # 依赖Frontend的健康状态
    depends_on:
      frontend:
        condition: service_healthy

2. 清理残留的错误卷数据

之前的卷已被Caddy的默认文件污染,需彻底删除后重新创建:

docker compose down -v
docker compose up -d

3. 验证Frontend镜像的构建产物

手动运行Frontend镜像,检查/app/dist目录是否存在你的构建文件:

docker run --rm hashirayaz/rehaish_frontend:latest ls -la /app/dist

如果输出为空或无index.html,说明Frontend镜像构建流程有问题,需修改Dockerfile确保包含构建步骤,示例如下:

# 示例Frontend Dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist

4. 额外优化:隔离Caddy默认文件与共享卷

若不想依赖健康检查,可修改Caddy的挂载路径,避免默认文件污染共享卷:

  • 修改Caddy的卷挂载配置:
    caddy:
      volumes:
        # 保留其他卷配置
        - frontend_build:/usr/share/caddy/site
    
  • 修改Caddyfile的root路径:
    rehaishkikhwaish.site {
        root * /usr/share/caddy/site
        # 保留其他配置
    }
    

内容的提问来源于stack exchange,提问作者Hashir Ayaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:10:20