Eugene Dounar
Eugene Dounar

Reputation: 1184

Default Docker entrypoint

I am creating an image from another image that set a specific entrypoint. However I want my image to have default one. How do I reset the ENTRYPOINT?

I tried the following Dockerfile:

FROM some-image
ENTRYPOINT ["/bin/sh", "-c"]

Unfortunately it doesn't work like the default entrypoint as it need the command to be quoted.

docker run myimage ls -l /    # "-l /" arguments are ignored
file1 file2 file3             # files in current working directory

docker run myimage "ls -l /"  # works correctly

How do I use commands without quoting?

Upvotes: 50

Views: 43903

Answers (3)

Matt
Matt

Reputation: 74660

To disable an existing ENTRYPOINT, set an empty array in your docker file

ENTRYPOINT []

Then your arguments to docker run will exec as a shell form CMD would normally.

The reason your ENTRYPOINT ["/bin/sh", "-c"] requires quoted strings is that without the quotes, the arguments to ls are being passed to sh instead.

Unquoted results in lots of arguments being sent to sh

"/bin/sh", "-c", "ls", "-l", "/"

Quoting allows the complete command (sh -c) to be passed on to sh as one argument.

"/bin/sh", "-c", "ls -l /"

Upvotes: 68

VonC
VonC

Reputation: 1323593

Note: beware of ENTRYPOINT [].

As mentioned in moby/moby issue 3465 ("Reset properties inherited from parent image"), Brendon C. notes:

Looks like ENTRYPOINT [] and ENTRYPOINT [""] both invalidate the cache on each build when not using BuildKit.

Simple Dockerfile to demonstrate:

FROM jrottenberg/ffmpeg:4.3-alpine311 as base

ENTRYPOINT []

RUN echo "HERE!"

Steps 2 and 3 will never use cache. This is my workaround:

FROM jrottenberg/ffmpeg:4.3-alpine311 as base

ENTRYPOINT ["/usr/bin/env"]

RUN echo "HERE!"

Upvotes: 3

Mohan
Mohan

Reputation: 8843

This isn't really related to docker. Try running the following:

/bin/sh -c echo foo

/bin/sh -c "echo foo"

The -c means that /bin/sh only picks up one argument. So removing the -c from the entrypoint you define should fix it. This is more flexible than resetting the entry point; e.g. you can do this to use Software Collections:

ENTRYPOINT ["scl", "enable", "devtoolset-4", "--", "bash"]

Upvotes: 5

Related Questions