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

GitLab CI/CD流水线docker-compose构建报错:COPY文件找不到

问题:GitLab CI/CD中docker-compose构建失败,本地执行正常

在本地Windows PowerShell中执行docker-compose build可正常完成镜像构建,但在GitLab CI/CD流水线中执行相同命令时失败,错误提示找不到JAR包文件。

错误信息

Building spotforus-server
Step 1/4 : FROM openjdk:17
 ---> 5e28ba2b4cdb
Step 2/4 : WORKDIR /spotforus
 ---> Using cache
 ---> 795b15010444
Step 3/4 : COPY build/libs/spotforus-0.0.1-SNAPSHOT.jar /spotforus/spotforus.jar
Service 'spotforus-server' failed to build: COPY failed: file not found in build context or excluded by .dockerignore: stat build/libs/spotforus-0.0.1-SNAPSHOT.jar: file does not exist

相关配置文件

docker-compose.yml

version: '3.8'

services:
    db:
      image: mysql:latest
      container_name: mysql-db
      ports:
        - "3306:3306"
      restart: always

    spotforus-client:
      build:
        context: ./spotforus-client
        dockerfile: Dockerfile
      container_name: "spotforus-client"
      ports:
        - "80:80"
      depends_on:
        - spotforus-server
    
    spotforus-server:                      
      build: ./spotforus            
      container_name: spotforus-server
      ports:
        - "8080:8080"                       
      restart: always
      depends_on:

spotforus目录下的Dockerfile

FROM openjdk:17
WORKDIR /spotforus
COPY build/libs/spotforus-0.0.1-SNAPSHOT.jar /spotforus/spotforus.jar
ENTRYPOINT ["java","-jar","spotforus.jar"]

.gitlab-ci.yml(原配置)

stages:
  - docker

docker:
  image:
    name: docker/compose:latest
  services:
    - docker:dind
  stage: docker
  script:
    - docker-compose build

GitLab Runner配置

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "Runner"
  url = "https://somedomain.gitlab/"
  id = 7341
  token = "BeNAc2f9gFW-sWX6pewA"
  token_obtained_at = 2022-11-08T09:36:30Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "gradle:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
    shm_size = 0

问题根源与解决方案

核心问题

本地执行时,你已经提前通过Gradle/Maven构建生成了build/libs/spotforus-0.0.1-SNAPSHOT.jar文件,但GitLab CI流水线直接跳过了构建步骤,直接执行docker-compose build,导致构建上下文(./spotforus目录)中没有该JAR包,从而触发COPY失败。

解决步骤

  1. 在CI流水线中添加构建阶段
    修改.gitlab-ci.yml,增加一个build阶段,先构建项目生成JAR包,再执行docker-compose构建:

    stages:
      - build
      - docker
    
    build:
      image: gradle:latest
      stage: build
      script:
        - cd spotforus
        - ./gradlew build -x test  # 执行Gradle构建,-x test可跳过测试加快速度
      artifacts:
        paths:
          - spotforus/build/libs/  # 保存构建产物,供docker阶段使用
    
    docker:
      image: docker/compose:latest
      services:
        - docker:dind
      stage: docker
      needs: ["build"]  # 依赖build阶段的产物
      script:
        - docker-compose build
    
    • 如果是Maven项目,将build阶段的镜像换成maven:latest,命令改为mvn package -DskipTests
  2. 检查.dockerignore配置
    确认spotforus目录下的.dockerignore文件没有排除build/或*.jar,否则即使生成了JAR包,也会被Docker忽略。

  3. 验证构建上下文路径
    docker-compose中spotforus-server的build路径为./spotforus,确保该目录下的Dockerfile能正确访问到build/libs子目录(构建阶段生成的产物会保留在此路径)。

内容的提问来源于stack exchange,提问作者z3r0-21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:15:31