49

What is the difference between shell and exec form for

CMD:

CMD python my_script.py arg

vs.

CMD ["python", "my_script.py", "arg"]

ENTRYPOINT:

ENTRYPOINT ./bin/main

vs.

ENTRYPOINT ["./bin/main"]

and RUN:

RUN npm start

vs.

RUN ["npm", "start"]

Dockerfile instructions?

Mike
  • 865
  • 1
  • 7
  • 22
Sheena
  • 14,644
  • 12
  • 71
  • 109
  • 1
    Does this answer your question? [What are shell form and exec form?](https://stackoverflow.com/questions/47904974/what-are-shell-form-and-exec-form) – fgul Feb 23 '20 at 07:25

1 Answers1

60

There are two differences between the shell form and the exec form. According to the documentation, the exec form is the preferred form. These are the two differences:

The exec form is parsed as a JSON array, which means that you must use double-quotes (“) around words not single-quotes (‘).

Unlike the shell form, the exec form does not invoke a command shell. This means that normal shell processing does not happen. For example, CMD [ "echo", "$HOME" ] will not do variable substitution on $HOME. If you want shell processing then either use the shell form or execute a shell directly, for example: CMD [ "sh", "-c", "echo $HOME" ]. When using the exec form and executing a shell directly, as in the case for the shell form, it is the shell that is doing the environment variable expansion, not docker.

Some additional subtleties here are:

The exec form makes it possible to avoid shell string munging, and to RUN commands using a base image that does not contain the specified shell executable.

In the shell form you can use a \ (backslash) to continue a single RUN instruction onto the next line.

There is also a third form for CMD:

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

Additionally, the exec form is required for CMD if you are using it as parameters/arguments to ENTRYPOINT that are intended to be overwritten.

Community
  • 1
  • 1
Matt Schuchard
  • 18,599
  • 3
  • 40
  • 57
  • 26
    I'd also note that using the shell form for ENTRYPOINT likely means you're [not propagating signals correctly](https://hynek.me/articles/docker-signals/) to your app, which can cause problems, in particular in Kubernetes clusters. – rln Oct 21 '19 at 15:03
  • 8
    this comment is much more important than the answer, which just repeats the documentation – 4c74356b41 Dec 24 '19 at 11:19
  • 2
    It's not useful to just copy and paste the documentation without further explanation! – Shaaer Mar 09 '21 at 15:15
  • 2
    What does the documentation mean by "shell string munging"? – Rnj Jan 24 '22 at 14:43