Docker镜像构建中解压文件后COPY命令提示目录不存在的问题求助
问题根源与解决方案
嘿,我一眼就看出问题出在哪了——你在多阶段构建的drop阶段里误用了COPY命令!
为什么会报错?
Docker的COPY命令默认是从你执行docker build的本地主机目录(也就是构建上下文)里读取文件,而不是从当前正在构建的drop阶段容器内部读取内容。你在drop阶段里通过curl和unzip已经在容器的/build目录下生成了amui文件夹,但COPY amui src/I.C.AM.C.P这条命令是在让Docker去你的本地电脑找amui,而不是在容器里找,这自然会报“文件不存在”的错误。
怎么解决?
既然amui已经在当前阶段的容器里了,你根本不需要用COPY,直接用RUN命令来移动/复制容器内的文件就行。根据你的需求,有两种方式:
方式1:直接解压到目标目录
如果你本来就想把压缩包内容放到src/I.C.AM.C.P,可以跳过中间的amui目录,直接解压到目标位置:
FROM build as drop RUN curl -o drop -u sdf@dise.com:ydfesdfasdfdf56pxvwnd5z6445l7kgezpb2lky6ja2g6xvtina4a --request GET 'https://abe.com/ded/c8002d3e-f4a9-4aea-9ab8-230027996c53/_apis/build/builds/1133376/artifacts?artifactName=drop&api-version=6.0&%24format=zip' -L # 直接解压到目标目录,省去移动步骤 RUN mkdir -p src/I.C.AM.C.P \ && unzip drop -d src/I.C.AM.C.P
方式2:先解压到amui,再移动到目标目录
如果你需要保留amui目录的中间步骤,就用mv命令代替COPY:
FROM build as drop RUN curl -o drop -u sdf@dise.com:ydfesdfasdfdf56pxvwnd5z6445l7kgezpb2lky6ja2g6xvtina4a --request GET 'https://abe.com/ded/c8002d3e-f4a9-4aea-9ab8-230027996c53/_apis/build/builds/1133376/artifacts?artifactName=drop&api-version=6.0&%24format=zip' -L RUN unzip drop -d amui \ && mkdir -p src/I.C.AM.C.P \ && mv amui/* src/I.C.AM.C.P/
额外提醒:如果后续阶段要用到这些内容
如果之后你需要在其他阶段(比如final阶段)复制drop阶段的内容,一定要用--from=drop指定来源阶段,比如:
FROM base as final WORKDIR /app # 从drop阶段的/build/src/I.C.AM.C.P目录复制内容到当前容器的/app COPY --from=drop /build/src/I.C.AM.C.P .
这样修改后,重新构建应该就能解决你的问题了!
内容的提问来源于stack exchange,提问作者ckv
相关产品推荐
相关产品推荐

