Bitbucket Pipeline部署Spring Boot应用至AWS ECR时Docker构建报错求助
解决Bitbucket Pipelines构建Docker镜像时找不到target/app.jar的问题
我之前搭建过Bitbucket Pipelines + AWS ECR的Spring Boot容器化流水线,刚好碰到过和你一模一样的问题,给你几个具体的解决思路:
核心问题分析
你遇到的COPY failed: file not found错误,主要源于两个关键点:
- Bitbucket Pipelines的每个Step都是独立运行的容器,默认不会共享文件,第一个Step生成的
target/app.jar无法被第二个Step直接访问到。 - Docker构建时的上下文路径配置错误,导致Docker在指定目录下找不到jar包。
具体解决方案
1. 配置Step间的文件共享(Artifacts)
首先需要让第一个Step把构建好的jar包传递给第二个Step,这就要用到Bitbucket的artifacts功能。修改你的Pipeline配置,在第一个Step里添加artifacts字段:
- step: name: Clean install script: - cd path.to.file - mvn clean install -DskipTests artifacts: - path.to.file/target/** # 将target目录下所有文件作为产物传递到下一个Step
这个配置会把第一个Step中生成的target目录完整保留,让后续Step可以正常访问到里面的jar包。
2. 调整Docker构建的上下文路径
第二个Step中,你当前是进入Dockerfile所在目录执行docker build .,此时Docker的构建上下文是这个目录,而你的jar包在path.to.file/target下,所以Docker找不到它。有两种调整方式:
方案A:指定构建上下文为项目根目录,同时指定Dockerfile路径
如果你的path.to.file(Spring Boot项目目录)和path.to.dockerfile(Dockerfile所在目录)是同级的,你可以在第二个Step里执行:
# 不需要进入Dockerfile目录,直接在项目根目录执行构建 docker build -t app-devtest -f path.to.dockerfile/Dockerfile .
.表示将项目根目录作为Docker构建上下文,这样Docker就能找到target/app.jar(因为artifacts已经把target目录传过来了)。-f path.to.dockerfile/Dockerfile指定Dockerfile的具体位置。
方案B:复制jar包到Dockerfile所在目录
如果你不想改变构建上下文路径,也可以把artifacts中的jar包复制到Dockerfile所在目录,再执行构建:
cd path.to.dockerfile # 根据实际相对路径调整,把jar包复制到当前目录 cp ../path.to.file/target/app.jar . docker build -t app-devtest .
3. 检查.dockerignore文件
最后别忘了检查项目根目录的.dockerignore文件,如果里面有target相关的排除规则,Docker构建时会忽略这个目录,也会导致找不到jar包。可以暂时注释掉这条规则测试:
# 注释掉这条规则 # target/
修改后的完整Pipeline配置示例
这里用方案A的配置,你可以直接参考:
image: maven:3.6.3 pipelines: default: - step: name: Clean install script: - cd path.to.file - mvn clean install -DskipTests artifacts: - path.to.file/target/** - step: name: Push to ECR services: - docker script: # 使用项目根目录作为构建上下文,指定Dockerfile路径 - docker build -t app-devtest -f path.to.dockerfile/Dockerfile . # 推送镜像到AWS ECR - pipe: atlassian/aws-ecr-push-image:1.4.2 variables: AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION: $AWS_DEFAULT_REGION IMAGE_NAME: app-devtest TAGS: 'latest'
内容的提问来源于stack exchange,提问作者philgsk
相关产品推荐
相关产品推荐

