Docker:无法执行二进制文件

31
我无法在我的Docker容器中运行任何二进制文件。
Dockerfile:
FROM ubuntu:eoan AS compiler-build

RUN apt-get update && \
    dpkg --add-architecture i386 && \
    apt-get install -y gcc \
                       gcc-multilib \
                       make \
                       cmake \
                       git \
                       python3.8 \
                       bash

WORKDIR /home
ADD . /home/pawn
RUN mkdir build
WORKDIR /home/build
ENTRYPOINT ["/bin/bash"]
CMD ["/bin/bash"]

我甚至不能使用file内置函数:

[root@LAPTOP-EJ5BH6DJ compiler]:~/dev/private/SAMP/compiler (v13.11.0) (master) dc run compiler file bash
/usr/bin/file: /usr/bin/file: cannot execute binary file
4个回答

60

来自这个论坛帖子

如果您在entrypoint中使用shell,但没有使用"-c"参数,则会出现此错误。

因此,如果您将Dockerfile更改为以下内容,则可以解决问题:

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]

然后您可以运行二进制文件。

请注意,从manpage中可以看出/bin/bash选项的目的:

  • -l:使bash表现得好像已被调用为登录shell一样

  • -c:如果存在-c选项,则会从第一个非选项参数command_string读取命令。如果在command_string之后有参数,则将第一个参数分配给$0,并将任何剩余的参数分配给位置参数。对$0的赋值设置了shell的名称,该名称用于警告和错误消息。

此外,这篇文章是关于如何同时使用ENTRYPOINTCMD以及它们的区别的值得一读。

编辑:这里还有一篇文章,其中提供了一个微不足道但比第一篇文章更清晰的使用echo shell内置命令的示例。

编辑:这是我链接的第二篇文章的微不足道示例的改编:

FROM ubuntu
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD [ "ls" ]

$ docker build -t test .

$ docker run --rm test
bin
boot
...
var

$ docker run --rm test "ls etc"
adduser.conf
alternatives
apt
...
update-motd.d
xattr.conf

请注意括号的使用,它们包含了ls /etc。如果不加引号,则/etc参数无法被传递给ls命令。这可能会导致出现意想不到的结果。

你能给我指点一下在实践中如何完成这个吗? - altabq
1
@altabq 很抱歉让你等了这么久。这里有一篇文章,它使用echo shell内置命令提供了一个微不足道的示例,我认为比我之前提供的文章更加清晰易懂。 - Charles German

7

看起来入口点不能指向/bin/bash。删除ENTRYPOINT ["/bin/bash"]就足以使其正常工作。


3

有时候我们无法控制镜像的Dockerfile,但它原始的入口点存在问题。

我们可以覆盖它的入口点来调试问题:

# example
docker run --rm \
    --entrypoint /bin/bash \
    -it apache/spark-py:v3.3.0


3

我遇到了相同的错误。与其他答案不同的是,我的错误与我的docker run参数有关:

# failed
docker run -it $(pwd | xargs basename):latest bash

# worked
docker run -it $(pwd | xargs basename):latest

我不需要添加bash,因为我已经在我的Dockerfile中有了它:

ENTRYPOINT ["/bin/bash"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接