Docker:无法执行二进制文件

Mis*_*iur 14 ubuntu docker

我无法在我的 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"]
Run Code Online (Sandbox Code Playgroud)

我什至不能使用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
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 22

这个论坛线程

当您在入口点中使用不带“-c”参数的 shell 时会发生此错误

所以,如果你改变你Dockerfile的结尾

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
Run Code Online (Sandbox Code Playgroud)

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

请注意手册/bin/bash页中 , 选项的用途:

  • -l: 使 bash 就像作为登录 shell 被调用一样

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

此外,这篇文章值得一读,了解如何同时使用两者ENTRYPOINT以及CMD它们的区别。

编辑: 是另一篇文章,它使用echo内置的shell进入一个微不足道的(但比第一篇文章更清晰)示例。

编辑:这是我链接的第二篇文章中的小例子的改编:

FROM ubuntu
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD [ "ls" ]
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)

注意"周围ls /etc。没有引号,参数/etc似乎没有ls像我期望的那样传递给命令。


Mis*_*iur 6

入口点/bin/bash似乎不能指向它。删除 ENTRYPOINT ["/bin/bash"]足以使其工作。