Back to Home
Docker
Docker ENTRYPOINT and CMD differences, exec form vs shell form comparison
entrypointcmddockerfileexec-formshell-form
ENTRYPOINT vs CMD
Understanding the differences between ENTRYPOINT and CMD in Docker.
Key Difference
- ENTRYPOINT: Defines the container's main executable
- CMD: Provides default arguments or defines the default command
CMD Only
FROM ubuntu:22.04
CMD ["echo", "Hello World"]
docker run myimage
# Output: Hello World
docker run myimage echo "Another message"
# Output: Another message (CMD overridden)
ENTRYPOINT Only
FROM ubuntu:22.04
ENTRYPOINT ["echo"]
docker run myimage Hello
# Output: Hello
docker run myimage Test 123
# Output: Test 123
ENTRYPOINT + CMD (Best Practice)
FROM python:3.12-slim
WORKDIR /app
COPY . .
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]
docker run myimage
# python app.py --port 8080
docker run myimage --port 3000
# python app.py --port 3000
Shell Form vs Exec Form
# Exec form (recommended) - runs as PID 1, receives signals
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]
# Shell form - wrapped with /bin/sh -c, signal handling issues
ENTRYPOINT python app.py
CMD --port 8080
Entrypoint Script Pattern
FROM node:18-alpine
WORKDIR /app
COPY . .
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
CMD ["node", "server.js"]
#!/bin/sh
# entrypoint.sh
echo "Environment: $NODE_ENV"
echo "Starting application..."
exec "$@"
Override Behavior
docker run myimage custom-command
docker run --entrypoint /bin/sh myimage
docker run --entrypoint python myimage script.py