分叉的 docker 镜像未构建

时间:2021-07-31 14:25:54

标签: docker

我正在尝试分叉 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

enter image description here

对我来说没有意义的是,如果我使用原始图像,它会成功构建:

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

1 个答案:

答案 0 :(得分:1)

从所描述的症状来看,文件存在,是一个 shell 脚本,并且可以在其他机器上运行,“找不到文件”错误很可能是由 Windows 换行符添加到文件中引起的。当 Linux 内核处理一个 shell 脚本时,它会查看第一行、#!/bin/sh 或类似的行,然后找到那个解释器来运行 shell 脚本。如果未找到该解释器,您将收到“找不到文件”错误。

在这种情况下,它要查找的文件不是 /bin/sh,而是 /bin/sh\r/bin/sh^M,具体取决于您要如何表示回车符。您可以使用 dos2unix 之类的工具修复单个文件的问题,但一般来说,您需要修复 git 本身,因为可能有其他文件的换行符已损坏。有关调整 git 行为的详细信息,请参阅 this post