Docker多阶段构建出现「文件未找到」异常求助
问题
我编写了如下Dockerfile,希望整合git、MinIO Client、zip工具,镜像构建过程无报错,但运行容器时,明明/usr/bin/git、/usr/bin/zip文件存在,执行时却提示「No such file or directory」,请问该如何解决?
Dockerfile内容
FROM alpine/git AS git RUN apk fix && apk --no-cache --update add zip VOLUME /root WORKDIR /root FROM minio/mc AS minio COPY --from=git /usr/bin/git /usr/bin/git COPY --from=git /usr/bin/zip /usr/bin/zip ENTRYPOINT ["sh"]
运行容器后的报错信息
Sending build context to Docker daemon 8.192kB Step 1/8 : FROM alpine/git AS git ---> 22d84a66cda4 Step 2/8 : RUN apk fix && apk --no-cache --update add zip ---> Using cache ---> 5ce4d94085d9 Step 3/8 : VOLUME /root ---> Using cache ---> 89329e40cbba Step 4/8 : WORKDIR /root ---> Using cache ---> 37f2c9216bb1 Step 5/8 : FROM minio/mc AS minio ---> 396036e5ac42 Step 6/8 : COPY --from=git /usr/bin/git /usr/bin/git ---> 543676360b6d Step 7/8 : COPY --from=git /usr/bin/zip /usr/bin/zip ---> 936165b36d2e Step 8/8 : ENTRYPOINT ["sh"] ---> Running in 4ee0c4b491f9 Removing intermediate container 4ee0c4b491f9 ---> 1279af2dd755 Successfully built 1279af2dd755 Successfully tagged fabric:latest [centos@ip-10-6-5-12 ~]$ sudo docker run -it fabric sh-4.4# which zip sh: which: command not found sh-4.4# zip sh: /usr/bin/zip: No such file or directory sh-4.4# which git sh: which: command not found sh-4.4# git sh: /usr/bin/git: No such file or directory sh-4.4# git sh: /usr/bin/git: No such file or directory sh-4.4# apt sh: apt: command not found sh-4.4# ls -al /usr/bin/git -rwxr-xr-x. 1 root root 2911912 Oct 19 04:51 /usr/bin/git
解决思路与方案
问题根源
alpine/git基于Alpine Linux,使用musl libc作为C标准库;而minio/mc基于RHEL/CentOS系镜像,使用glibc。直接复制Alpine环境编译的git、zip二进制文件到glibc环境中,会因为依赖的底层C库不兼容,导致系统无法找到对应的动态链接依赖,进而出现「文件存在但无法执行」的错误。
解决方案
有两种可靠的解决方式:
方式一:基于Alpine构建统一环境
以alpine/git为基础镜像,直接安装minio/mc,确保整个环境的C标准库统一为musl:
FROM alpine/git # 安装zip工具 RUN apk fix && apk --no-cache --update add zip # 下载并安装minio/mc RUN wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/bin/mc \ && chmod +x /usr/bin/mc VOLUME /root WORKDIR /root ENTRYPOINT ["sh"]
方式二:基于minio/mc的基础镜像安装工具
minio/mc的基础镜像属于RHEL/CentOS系,直接用yum安装git和zip,确保二进制文件依赖glibc:
FROM minio/mc # 安装git和zip工具,清理yum缓存减少镜像体积 RUN yum install -y git zip && yum clean all VOLUME /root WORKDIR /root ENTRYPOINT ["sh"]
验证
构建镜像后运行容器,执行git --version和zip --version,如果能正常输出版本信息,说明问题已解决。
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

