Github Actions生成dist后传入Dockerfile失败,如何解决?
解决Vite应用容器化中GitHub Actions构建后Docker复制dist失败的问题
我尝试将大型Vite应用容器化,在Dockerfile内执行vite build时出现内存不足(out of memory)错误。于是转到GitHub Actions中执行vite build生成dist文件夹,但现在在Dockerfile中复制该dist文件夹时动作失败。
现有配置
GitHub Actions Workflow
name: Build Image on: push: branches: ["Kev-TestImage"] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: [18.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: "npm" - run: npm install --legacy-peer-deps - run: npm run build - uses: azure/docker-login@v1 with: login-server: hidden username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - run: | docker build . -t hidden docker push hidden
Dockerfile
FROM node:18-bullseye-slim WORKDIR /app COPY package*.json ./ RUN npm install --legacy-peer-deps # Copy the generated 'dist' folder into the container COPY dist ./dist COPY vite.config.ts ./vite.config.ts EXPOSE 3000 CMD ["npm", "run", "preview"]
错误原因分析
从错误提示(COPY failed: stat /var/lib/docker/tmp/docker-builderxxxx/dist: no such file or directory)来看,核心问题是Docker构建上下文无法获取GitHub Actions中生成的dist文件夹,常见诱因有两个:
- 项目根目录的
.dockerignore文件中包含dist条目,导致Docker构建时自动忽略该文件夹; - GitHub Actions中
npm run build未成功生成dist文件夹,或生成路径不在Docker上下文范围内。
解决方案
1. 检查并修改.dockerignore
打开项目根目录的.dockerignore文件,如果存在dist行,直接删除该条目,确保Docker构建上下文能包含dist文件夹。
2. 验证dist文件夹是否生成
在GitHub Actions的Workflow中添加验证步骤,确认npm run build成功生成dist:
# 在npm run build步骤后添加 - run: ls -la dist
这一步能直观看到dist文件夹是否存在及内部文件情况,若执行失败,需先排查npm run build的报错信息。
3. 优化Dockerfile(可选)
既然已在GitHub Actions中完成构建,Dockerfile无需安装全量依赖,可仅保留预览所需的生产依赖,减少镜像体积:
FROM node:18-bullseye-slim WORKDIR /app COPY package*.json ./ # 仅安装生产依赖 RUN npm install --legacy-peer-deps --only=production # 复制dist文件夹 COPY dist ./dist # 若npm run preview不需要vite.config.ts,可删除此行 COPY vite.config.ts ./vite.config.ts EXPOSE 3000 CMD ["npm", "run", "preview"]
内容的提问来源于stack exchange,提问作者KoolKoderKev
相关产品推荐
相关产品推荐

