Docker, a powerful containerization platform, provides flexibility in defining how your containers should behave. Two key instructions, CMD
and ENTRYPOINT
, play crucial roles in determining what happens when you start a Docker container. Let’s delve into the distinctions between these instructions and explore how they impact container behavior.
The Basics
CMD Instruction
The CMD
instruction in a Dockerfile sets the default command and its parameters to be executed when a container starts. It can be overridden by providing arguments at runtime. You can specify the command and its arguments as a list or as a string.
FROM busybox:latest
CMD ["echo", "Hello, CMD!"]
In this example, if you run the container without providing a command, it will execute echo Hello, CMD!
by default.
docker run my-busybox-container
You can also override the CMD
when running the container:
docker run my-ubuntu-container echo "Override CMD"
ENTRYPOINT Instruction
The ENTRYPOINT
instruction sets the primary command to run and its default parameters. Unlike CMD
, the ENTRYPOINT
command and its parameters are not ignored when you provide a command at runtime. As with CMD
, you can specify the command and its arguments as a list or as a string.
FROM busybox:latest
ENTRYPOINT ["echo", "Hello, ENTRYPOINT!"]
CMD ["Default CMD argument"]
Here, if you run the container without providing a command, it will execute echo Hello, ENTRYPOINT! Default CMD argument
by default.
docker run my-busybox-container
You can still override both ENTRYPOINT
and CMD
when running the container:
docker run my-busybox-container echo "Override both ENTRYPOINT and CMD"
The provided command is appended to the ENTRYPOINT
and overrides the CMD
argument.
Key Differences
CMD vs. ENTRYPOINT
-
Overridability:
- CMD: Can be overridden by providing a command at runtime.
- ENTRYPOINT: The primary command and its parameters are not ignored even when providing a command at runtime.
-
Command Combination:
- CMD: If the Dockerfile has multiple
CMD
instructions, only the last one takes effect. - ENTRYPOINT: The
CMD
arguments are appended to theENTRYPOINT
command if both instructions are present.
- CMD: If the Dockerfile has multiple
Choosing Between CMD and ENTRYPOINT
Use CMD
When:
- You want to provide defaults for the command.
- You anticipate users may want to override the command frequently.
Use ENTRYPOINT
When:
- You want to define the main command and its default parameters.
- You want to enforce a specific behavior and not allow easy overrides.
Conclusion
Understanding the nuances between CMD
and ENTRYPOINT
is crucial for effectively configuring your Docker containers. Whether you need flexibility for command overrides or wish to enforce a specific behavior, choosing the right instruction is key. With this knowledge, you can harness the full power of Docker to streamline your containerized applications.