我正在尝试分叉 this docker image 以便如果原始版本发生任何变化,它不会影响我。
我已将与该图像对应的 the repo 分叉到 my own repo。
我已经克隆了 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
Following this method,我检查了容器以查看 sh 文件是否确实存在。这是输出。
我运行了 docker run --rm -it c53693f11514 bash
,包括 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
答案 0 :(得分:1)
从所描述的症状来看,文件存在,是一个 shell 脚本,并且可以在其他机器上运行,“找不到文件”错误很可能是由 Windows 换行符添加到文件中引起的。当 Linux 内核处理一个 shell 脚本时,它会查看第一行、#!/bin/sh
或类似的行,然后找到那个解释器来运行 shell 脚本。如果未找到该解释器,您将收到“找不到文件”错误。
在这种情况下,它要查找的文件不是 /bin/sh
,而是 /bin/sh\r
或 /bin/sh^M
,具体取决于您要如何表示回车符。您可以使用 dos2unix
之类的工具修复单个文件的问题,但一般来说,您需要修复 git 本身,因为可能有其他文件的换行符已损坏。有关调整 git 行为的详细信息,请参阅 this post。