构建Spring/React应用时Docker Build Context失败求助
Docker构建React+Spring项目报错:
failed to solve : error from sender: context canceled 我尝试通过Docker容器构建React前端,并将其部署到Spring后端的静态资源目录中。作为Docker新手,我遇到了错误:failed to solve : error from sender: context canceled。该项目昨日还能正常构建,但今日执行docker compose up --build时持续出现此错误。
Dockerfile
# Build the React frontend FROM node:latest as build-stage WORKDIR /app # 将package.json复制到app目录 COPY FrontEnd/package*.json /app/ RUN npm install COPY FrontEnd/ /app/ RUN npm run build # Build the Spring Boot application FROM openjdk:17-jdk-slim as build-app WORKDIR /app # 安装xargs(Ubuntu使用apt包管理) RUN apt-get update && apt-get install -y findutils && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY --from=build-stage /app/dist /app/src/main/resources/static COPY . /app/ RUN chmod +x gradlew RUN apt-get update && apt-get install -y dos2unix && dos2unix gradlew RUN find ./ -name "*.java" | xargs dos2unix RUN ./gradlew build -x test # 准备运行时容器 FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=build-app /app/build/libs/*.jar /app/app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
Docker Compose配置文件
version: "3.8" services: postgres-dev-db: container_name: assignment5 image: "postgres" restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: assignment5 volumes: - ./postgres-data:/var/lib/postgresql/data ports: - "5455:5432" app: build: . ports: - "8080:8080" depends_on: - postgres-dev-db environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres-dev-db:5432/assignment5 SPRING_DATASOURCE_USERNAME: postgres SPRING_DATASOURCE_PASSWORD: postgres
执行docker build .的结果
docker build . [+] Building 9.9s (7/22) docker:desktop-linux => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 908B 0.0s => [internal] load metadata for docker.io/library/openjdk:17-jdk-slim 0.6s => [internal] load metadata for docker.io/library/node:latest 0.6s => [build-stage 1/6] FROM docker.io/library/node:latest@sha256:0052410af98158173b17a26e0e2a46a3932095ac9a0ded660439a8ffae65b1e3 0.0s => [build-app 1/10] FROM docker.io/library/openjdk:17-jdk-slim@sha256:aaa3b3cb27e3e520b8f116863d0580c438ed55ecfa0bc126b41f68c3f62f9774 0.0s => CANCELED [internal] load build context 8.7s => => transferring context: 171.30MB 8.5s ERROR: failed to solve: error from sender: context canceled
解决方法
1. 完善.dockerignore文件
从构建日志看,传输的构建上下文高达171MB,大概率是未排除冗余文件导致传输超时被取消。在项目根目录创建或修改.dockerignore文件,添加以下内容:
# 前端冗余文件 FrontEnd/node_modules FrontEnd/build FrontEnd/dist # Spring冗余文件 .gradle build *.log # 数据库数据目录 postgres-data # Git相关文件 .git .gitignore
2. 优化Dockerfile的文件复制逻辑
当前build-app阶段使用COPY . /app/会复制整个项目目录,包括前端的无用文件。可以改成只复制Spring项目必需的文件:
# 替换原有的COPY . /app/ COPY src/ /app/src/ COPY gradlew /app/ COPY build.gradle /app/ COPY settings.gradle /app/
3. 调整Docker资源配额
如果使用Docker Desktop,可能是内存或CPU分配不足导致构建超时。进入Docker Desktop设置 -> Resources,适当增加内存(建议4GB以上)和CPU核心数。
4. 清理Docker缓存
缓存损坏也可能引发异常,执行以下命令清理无用镜像、容器和缓存:
docker system prune -a
清理完成后重新执行构建命令。
5. 分步构建排查问题
拆分构建步骤,先单独构建前端阶段确认是否正常:
docker build --target build-stage .
若前端构建正常,再构建Spring阶段:
docker build --target build-app .
通过分步构建定位具体出错的环节。
内容的提问来源于stack exchange,提问作者RogueGingerz
相关产品推荐
相关产品推荐

