Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker: Cannot execute binary file

Tags:

docker

ubuntu

I can't run any binary in my docker container.

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"]

I can't even use file builtin:

[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
like image 409
Misiur Avatar asked Apr 06 '20 07:04

Misiur


People also ask

Can not execute binary file?

This error typically occurs when a binary file for a certain processor architecture is run on a different architecture e.g., an x86 executable is run on an ARM CPU.

How do I run a binary file on a Mac?

Press "Enter" on the keyboard after every command you enter into Terminal. You can also execute a file without changing to its directory by specifying the full path. Type "/path/to/NameOfFile" without quotation marks at the command prompt. Remember to set the executable bit using the chmod command first.

What is the difference between entrypoint and CMD in Docker?

CMD vs ENTRYPOINT: Fundamental differences CMD commands are ignored by Daemon when there are parameters stated within the docker run command. ENTRYPOINT instructions are not ignored but instead are appended as command line parameters by treating those as arguments of the command.


1 Answers

From this forum thread:

This error occurs when you use a shell in your entrypoint without the "-c" argument

So, if you change your Dockerfile to end with

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

then you can run binary files.

Note the purpose of the options for /bin/bash, from the manpage:

  • -l: Make bash act as if it had been invoked as a login shell

  • -c: If the -c option is present, then commands are read from the first non-option argument command_string. If there are arguments after the command_string, the first argument is assigned to $0 and any remaining arguments are assigned to the positional parameters. The assignment to $0 sets the name of the shell, which is used in warning and error messages.

Additionally, this article is a worthwhile read on how to use both ENTRYPOINT and CMD together, and what their differences are.

EDIT: Here's another article that goes into a trivial (but clearer than the first article) example using the echo shell builtin.

EDIT: Here's an adaptation of the trivial example from the second article I linked:

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

Note the " around ls /etc. Without the quotes, the argument /etc doesn't seem to be passed to the ls command as I might expect.

like image 177
Charles German Avatar answered Oct 29 '22 05:10

Charles German