Bitbucket Pipeline构建报错:COPY未指定源文件,本地构建正常求排查
Bitbucket Pipeline构建Docker镜像时COPY失败,本地构建正常
问题描述
执行Bitbucket Pipeline时触发报错:
COPY ./fronted/package*.json ./ COPY failed: no source files were specified
但本地执行以下构建命令可成功完成:
root@project:/frontend# docker build -f docker/Dockerfile -t frontend:6.0 .
仓库文件结构
|-- fronted | |-- package.json | |-- other frontend files |-- docker | |-- Dockerfile | |-- nginx.conf |-- bitbucket-pipelines.yml
相关配置文件
Dockerfile内容
FROM node:lts-alpine as build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Step 2: Create Nginx Server FROM nginx:stable-alpine as production-stage COPY docker/nginx.conf /etc/nginx/nginx.conf COPY --from=build-stage /app/dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]
bitbucket-pipelines.yml内容
image: atlassian/default-image:3 pipelines: branches: master: - step: runs-on: - 'self.hosted' - 'linux' name: Build and Save image script: - echo "Building Docker image" - export DOCKER_HOST=tcp://127.0.0.1:2375 - docker login docker-c2.comp.net -u admin -p $NEXUS_PASSWORD - docker build -f frontend/docker/Dockerfile -t docker-c2.comp.net/support-center-netcore/fronted-support-center-netcore-kz:v1.$BITBUCKET_BUILD_NUMBER . # Push the Docker image to the container registry2 - docker push docker-c2.comp.net/support-center-netcore/fronted-support-center-netcore-kz:v1.$BITBUCKET_BUILD_NUMBER
问题原因
- 构建上下文与文件路径不匹配:
本地构建时,你是在/frontend目录(对应仓库的fronted目录)执行命令,构建上下文为当前目录,Dockerfile中的COPY package*.json ./能直接找到该目录下的文件;但Bitbucket Pipeline中构建上下文是仓库根目录,Dockerfile里的相对路径会在根目录查找package*.json,而实际文件在fronted子目录下,导致找不到文件报错。 - 目录拼写错误:Pipeline构建命令中指定的Dockerfile路径是
frontend/docker/Dockerfile,但仓库实际目录名为fronted(少一个字母n),且Dockerfile实际在根目录的docker子目录下,路径完全不匹配。
解决方法
方法1:修改Dockerfile中的路径,适配根目录构建上下文
调整Dockerfile里的COPY命令,指定文件所在的fronted子目录:
FROM node:lts-alpine as build-stage WORKDIR /app # 从根目录的fronted子目录复制package文件 COPY fronted/package*.json ./ RUN npm install # 复制fronted目录下的所有内容到工作目录 COPY fronted/ . RUN npm run build # Step 2: Create Nginx Server FROM nginx:stable-alpine as production-stage # 从根目录的docker子目录复制配置文件 COPY docker/nginx.conf /etc/nginx/nginx.conf COPY --from=build-stage /app/dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]
方法2:调整Pipeline构建命令,切换到fronted目录执行
修改Pipeline脚本,进入fronted目录后再执行构建,此时构建上下文为fronted目录,和本地环境一致:
script: - echo "Building Docker image" - export DOCKER_HOST=tcp://127.0.0.1:2375 - docker login docker-c2.comp.net -u admin -p $NEXUS_PASSWORD # 切换到fronted目录,指定上层目录的Dockerfile - cd fronted && docker build -f ../docker/Dockerfile -t docker-c2.comp.net/support-center-netcore/fronted-support-center-netcore-kz:v1.$BITBUCKET_BUILD_NUMBER . - docker push docker-c2.comp.net/support-center-netcore/fronted-support-center-netcore-kz:v1.$BITBUCKET_BUILD_NUMBER
必做:修正目录拼写错误
无论采用哪种方法,都要将Pipeline构建命令中的frontend/docker/Dockerfile改为正确路径:如果用方法1则改为docker/Dockerfile,如果用方法2则改为../docker/Dockerfile,确保路径完全匹配仓库结构。
内容的提问来源于stack exchange,提问作者Breaking News
相关产品推荐
相关产品推荐

