使用CircleCI ECR Orb构建Docker镜像时遇/init.sh未找到错误求助
解决CircleCI构建Docker镜像时找不到init.sh的问题
我在用CircleCI搭配ECR Orb构建Docker镜像并推送到Elastic Container Registry(ECR)时,一直碰到这个错误:
ERROR: failed to solve: failed to compute cache key: "/init.sh" not found
我的目录结构是这样的:
Terraform .circleci infra frontend --- Dockerfile --- init.sh
也就是Terraform根目录下有infra和frontend两个子目录,frontend里放着Dockerfile和init.sh脚本。
Dockerfile内容:
FROM node:14 ENV JQ_VERSION=1.6 RUN wget --no-check-certificate https://github.com/stedolan/jq/releases/download/jq-${JQ_VERSION}/jq-linux64 -O /tmp/jq-linux64 RUN cp /tmp/jq-linux64 /usr/bin/jq RUN chmod +x /usr/bin/jq WORKDIR /app COPY . . RUN jq 'to_entries | map_values({ (.key) : ("$" + .key) }) | reduce .[] as $item ({}; . + $item)' ./src/config.json > ./src/config.tmp.json && mv ./src/config.tmp.json ./src/config.json RUN npm install && npm run build FROM nginx:1.17 ENV JSFOLDER=/usr/share/nginx/html/js/*.js COPY ./init.sh /usr/bin/init.sh RUN chmod +x /usr/bin/init.sh WORKDIR /usr/share/nginx/html COPY --from=0 /app/dist . ENTRYPOINT [ "init.sh" ]
CircleCI配置文件内容:
version: '2.1' orbs: aws-ecr: circleci/aws-ecr@8.2.1 aws-cli: circleci/aws-cli@3.1 jobs: build: machine: image: ubuntu-2004:2022.10.1 steps: - checkout - aws-ecr/build-and-push-image: repo: frontend push-image: true region: ${AWS_REGION} registry-id: REGISTRY_ID dockerfile: frontend/Dockerfile path: . tag: ${CIRCLE_SHA1} workflows: test: jobs: - build:
CircleCI返回的错误详情:
> [stage-1 2/5] COPY ./init.sh /usr/bin/init.sh: ------ ERROR: failed to solve: failed to compute cache key: "/init.sh" not found: not found Exited with code exit status 1
问题原因
问题出在Docker构建上下文的设置上。CircleCI配置里的path: .指定了以项目根目录(也就是Terraform目录)作为构建上下文,而Dockerfile里写的COPY ./init.sh是从构建上下文根目录找这个文件,但实际上init.sh在frontend子目录里,所以Docker找不到它。
解决方案
方案一:修改CircleCI的构建上下文路径
把CircleCI配置里的path从.改成frontend,构建上下文就变成frontend目录,Dockerfile里的相对路径就能正确找到init.sh了。修改后的配置:
version: '2.1' orbs: aws-ecr: circleci/aws-ecr@8.2.1 aws-cli: circleci/aws-cli@3.1 jobs: build: machine: image: ubuntu-2004:2022.10.1 steps: - checkout - aws-ecr/build-and-push-image: repo: frontend push-image: true region: ${AWS_REGION} registry-id: REGISTRY_ID dockerfile: Dockerfile # 上下文改为frontend后,直接写Dockerfile即可 path: frontend # 关键修改点 tag: ${CIRCLE_SHA1} workflows: test: jobs: - build:
方案二:修改Dockerfile里的COPY路径
保持CircleCI的构建上下文不变,把Dockerfile里的COPY ./init.sh改成COPY ./frontend/init.sh,让Docker从根上下文的frontend子目录找文件。修改后的Dockerfile相关部分:
FROM nginx:1.17 ENV JSFOLDER=/usr/share/nginx/html/js/*.js COPY ./frontend/init.sh /usr/bin/init.sh # 修改路径 RUN chmod +x /usr/bin/init.sh WORKDIR /usr/share/nginx/html COPY --from=0 /app/dist . ENTRYPOINT [ "init.sh" ]
内容的提问来源于stack exchange,提问作者Somethingwhatever
相关产品推荐
相关产品推荐

