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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:05:35