Docker FAQ
RUN, CMD, ENTRYPOINT
| Instruction | RUN | CMD | ENTRYPOINT | 
|---|---|---|---|
| Summary | Execute “build commands”. | Specify default commands. | Specify default executable. | 
| Description | RUNexecutes any commands to create a new layer on top of current image | CMDsets the command to be executed when running a container from image. | An ENTRYPOINTallows you to configure a container that will run as an executable. | 
| Example | RUN apt-get update && apt-get install -y neofetch | ||
| Notes | - The main purpose of a CMDis to provide (default command) and its parameters for an executing container.1 | ||
| - CMDcan also be used to only provide default parameters for theENTRYPOINTinstruction. 2 | - Command line arguments to docker run <image>will be appended after all elements in an exec formENTRYPOINT, and will override all elements specified usingCMD. | ||
| - You can override the ENTRYPOINT instruction using the docker run --entrypointflag. | |||
| Provide defaults (executable and/or parameters) for an executing container | The container’s main executable. | 
Example:
- 
A simple Dockerfile use RUNto install neofetch and add a layerFROM ubuntu:latest RUN apt-get update && apt-get install -y neofetch
- 
FROM debian-slim:latest # ... ENTRYPOINT ["docker-entrypoint.sh"] # ... CMD ["mysqld"]
- 
FROM debian:bookworm-slim # ... ENTRYPOINT ["/docker-entrypoint.sh"] # ... CMD ["nginx", "-g", "daemon off;"]
Exec form vs shell form
| Exec form | Shell form | |
|---|---|---|
| Syntax | CMD [ "executable" , "param1" , "param2" ] | RUN executable param1 param2 | 
| Example | CMD [ "nginx" , "-g", "daemon off;" ] | RUN apt-get update && apt-get install -y neofetch | 
| Advantages | - Avoid shell string munging | More relaxed, and emphasizes ease of use, flexibility, and readability | 
| - Invoke commands using a specific command shell, or any other executable3 | - Long commands can be split up into multiple lines4 | |
| Disadvantages | There is no automatically5 using of a command shell: | There is an automatically using of a command shell6 (the default shell7). | 
| - There is no shell processing, e.g. variable substitution8 | ||
| - The backslashes need to be escaped9 | ||
| How is it parsed? | As a JSON array10 | As a regular string4 | 
For more information, see exec and shell form | Docker
CMD [ "executable" , "param1" , "param2" ] (exec form)
CMD [ "param1" , "param2" ] (exec form, as default parameters to ENTRYPOINT)
You must use double-quotes (") around words, not single-quotes ('). e.g. ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
RUN [ "echo", "$HOME" ] won’t handle variable substitution for $HOME, but
You can invoke the command with any shell you want, but you need to do it for every command in the exec form.
You can execute a shell directly with the exec form, for example: RUN [ "sh", "-c", "echo $HOME" ]
On a Windows machine: RUN ["c:\\windows\\system32\\tasklist.exe"]
For example, RUN source $HOME/.bashrc && echo $HOME can be split into multiple lines
- 
Using escape character RUN apt-get update && \ apt-get install -y neofetch
- 
Using heredocs RUN <<EOF apt-get update apt-get install -y neofetch EOFFor more information about heredocs, see 
You can override the default shell used for the shell form of command by using SHELL instruction
For example:
# Change the default shell to bash
SHELL ["/bin/bash", "-c"]
The default shell used for the shell form of command:
- On Linux: ["/bin/sh", "-c"]
- On Windows: ["cmd", "/S", "/C"]