我正在尝试分叉这个 docker 镜像,这样如果原始镜像发生任何变化,它就不会影响我。
我已经克隆了 repo 并正在尝试构建它:
docker build . -t davcal/gcc-cross-x86_64-elf
我收到此错误:
+ cd /usr/local/src
+ ./build-binutils.sh 2.31.1
/bin/sh: 1: ./build-binutils.sh: not found
The command '/bin/sh -c set -x && cd /usr/local/src && ./build-binutils.sh ${BINUTILS_VERSION} && ./build-gcc.sh ${GCC_VERSION}' returned a non-zero code: 127
对我来说毫无意义的是,如果我使用原始图像,它会成功构建:
FROM randomdude/gcc-cross-x86_64-elf
...
也许 Docker Hub 存储了一个预先构建的镜像?
我该如何解决?
注意:我使用的是 Windows。这应该没有区别,因为错误源自容器。
编辑
我尝试Dockerfile
将 chmod 可执行权限修补到 sh 文件,以防在 Windows 上引起问题。不幸的是,发生了完全相同的错误。
RUN set -x \
&& chmod +x /usr/local/src/build-binutils.sh \
&& chmod +x /usr/local/src/build-gcc.sh \
&& cd /usr/local/src \
&& ./build-binutils.sh ${BINUTILS_VERSION} \
&& ./build-gcc.sh ${GCC_VERSION}
编辑 2
按照这种方法,我检查了容器以查看 sh 文件是否确实存在。这是输出。
我跑了docker run --rm -it c53693f11514 bash
,包括上一步成功的中间容器的hash Dockerfile
。
这是显示文件确实存在的输出:
root@9b8a64ac2090:/# cd usr/local/src
root@9b8a64ac2090:/usr/local/src# ls
binutils-2.31.1 build-binutils.sh build-gcc.sh gcc-8.2.0
从描述的症状来看,文件存在,是一个 shell 脚本,并且可以在其他机器上运行,“找不到文件”错误很可能是由于 Windows 换行符被添加到文件中。Linux内核在处理一个shell脚本时,会先看第一行,#!/bin/sh
或者类似的,然后找到那个解释器来运行这个shell脚本。如果未找到该解释器,您将收到“找不到文件”错误。
在这种情况下,它要查找的文件不是/bin/sh
, 而是 ,/bin/sh\r
或者/bin/sh^M
取决于您要如何表示回车符。您可以使用类似工具修复单个文件,dos2unix
但一般来说,您需要修复 git 本身,因为可能有其他文件的换行符已损坏。有关调整 git 行为的详细信息,请参阅此帖子。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句