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失败。
解决步骤
在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
- 如果是Maven项目,将
检查.dockerignore配置
确认spotforus目录下的.dockerignore文件没有排除build/或*.jar,否则即使生成了JAR包,也会被Docker忽略。验证构建上下文路径
docker-compose中spotforus-server的build路径为./spotforus,确保该目录下的Dockerfile能正确访问到build/libs子目录(构建阶段生成的产物会保留在此路径)。
内容的提问来源于stack exchange,提问作者z3r0-21
相关产品推荐
相关产品推荐

