41

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

4 Answers 4

78

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.

Sign up to request clarification or add additional context in comments.

4 Comments

Could you give me a pointer how this is done in practice?
@altabq Sorry for taking a while to get back to you. Here's another article that goes over a trivial example using the echo shell builtin that I think is a bit clearer than the original article I linked.
@scaryman Thanks for pointing that out; just updated the answer with your link
7

Entrypoint can't point to /bin/bash it seems. Removing ENTRYPOINT ["/bin/bash"] is enough to make it work.

Comments

5

There are times when we don't have control over the image's Dockerfile but it's original entrypoint has an issue.

We could overwrite it's entrypoint to debug issues:

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

Comments

3

I hit the same error. Unlike the other answers, my error was related to my docker run parameters:

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

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

I didn't need to add bash as I already had this in my Dockerfile:

ENTRYPOINT ["/bin/bash"]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.