Mustafa CavusogluMC

Command Palette

Search for a command to run...

AboutExperiencesProjects
Linux3Docker7Git4Kubernetes4Network2uv1Miniconda1
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