Beginner LevelDocker & Deployment
What is the difference between CMD and ENTRYPOINT in a Dockerfile?
❓ Interview Prompt: Compare CMD and ENTRYPOINT regarding default arguments, override behavior at runtime, and shell vs exec form.
CMD and ENTRYPOINT both define what runs when a container starts, but they interact in specific ways:
CMD — Default Arguments (Easily Overridden):
•
Provides default arguments for the container start command.
•
Fully overridden when you pass arguments to
docker run: docker run myimage <override>.•
Best for containers that should be flexible (e.g., running different scripts).
ENTRYPOINT — Fixed Executable (Hard to Override):
•
Sets the executable that always runs — it is NOT replaced by
docker run arguments.•
docker run arguments are appended to ENTRYPOINT as extra arguments.•
Override requires the
--entrypoint flag explicitly.Combined Usage (Best Practice):
Use ENTRYPOINT for the fixed binary and CMD for overridable default arguments:
```
ENTRYPOINT ["node"] # fixed binary
CMD ["server.js"] # default arg, replaceable by: docker run myimage worker.js
```
Shell vs Exec Form:
•
Shell form:
CMD npm start — runs via /bin/sh -c, meaning PID 1 is sh, not your app. Signals (SIGTERM) may not reach the process.•
Exec form:
CMD ["npm", "start"] — runs directly, your app gets PID 1 and receives signals properly.Code Implementation Example
dockerfile
# Pattern: ENTRYPOINT = fixed binary, CMD = overridable default argument
FROM node:20-alpine
WORKDIR /app
COPY . .
ENTRYPOINT ["node"] # always runs node
CMD ["server.js"] # default: node server.js
# docker run myimage → runs: node server.js
# docker run myimage worker.js → runs: node worker.js (CMD overridden)
# docker run --entrypoint="" myimage ls → override ENTRYPOINT entirely💡ENTRYPOINT pins the binary; CMD supplies overridable default arguments appended to it.
🎯 Interview Key Takeaway
Use exec-form ENTRYPOINT for the fixed binary and CMD for overridable defaults. Always use exec form (JSON array) to ensure your app receives OS signals as PID 1.
#Dockerfile#CMD#ENTRYPOINT#PID1#Signals#Beginner
Back to all Docker & Deployment Questions→