π§Ύ Dockerfile Command Reference
Each command in a Dockerfile defines a specific instruction for how to build a Docker image. Hereβs a detailed breakdown:
  
  
  1οΈβ£ FROM β Set the Base Image ποΈ
FROM node:20-alpine
β
 What it does:
Defines the base image your custom image will build on top of.
π Must be the first instruction in the Dockerfile (except
ARGsometimes).
  
  
  2οΈβ£ WORKDIR β Set Working Directory π
WORKDIR /app
β
 What it does:
Sets the working directory inside the container where all subsequent commands (COPY, RUN, etc.) will execute.
π Automatically creates the directory if it doesnβt exist.
  
  
  3οΈβ£ COPY β Copy Files into the Image π¦
COPY package*.json ./
COPY . .
β
 What it does:
Copies files/directories from your host into the container filesystem.
π‘ Use
.dockerignoreto exclude unnecessary files.
  
  
  4οΈβ£ RUN β Execute a Shell Command π οΈ
RUN npm install
RUN apk add --no-cache curl
β
 What it does:
Runs a command (like installing packages, cleaning up files) at build time, and creates a new layer.
π‘ Combine multiple commands to reduce image size:
RUN apk add --no-cache curl && npm install
  
  
  5οΈβ£ CMD β Default Command to Run on Container Start π
CMD ["npm", "start"]
β
 What it does:
Specifies the default command that gets run when the container starts.
π‘ Only one
CMDallowed β if multiple, only the last is used.
  
  
  6οΈβ£ EXPOSE β Document the Appβs Port π
EXPOSE 8000
β
 What it does:
Informs Docker that the app runs on a specific port β used for documentation and port binding.
π‘ Does not actually publish the port (use
-pindocker run).
  
  
  7οΈβ£ ENV β Set Environment Variables π§ͺ
ENV PORT=8000
ENV NODE_ENV=production
β
 What it does:
Defines environment variables inside the container, usable by the app or shell.
π‘ Use
process.env.PORTin Node.js.
  
  
  8οΈβ£ ARG β Build-Time Variables βοΈ
ARG NODE_VERSION=20-alpine
FROM node:${NODE_VERSION}
β
 What it does:
Defines variables that you can pass during docker build with --build-arg.
π Unlike
ENV,ARGis not available during runtime.
  
  
  9οΈβ£ ENTRYPOINT β Hard-Coded Command π
ENTRYPOINT ["node", "index.js"]
β
 What it does:
Defines the main executable β like CMD, but less override-able.
π‘ Combine with
CMDfor arguments:
ENTRYPOINT ["npm"]
CMD ["start"]
  
  
  π LABEL β Metadata About the Image π·οΈ
LABEL maintainer="Darshan Vasani"
LABEL version="1.0"
β
 What it does:
Adds metadata like author, version, description to your image.
π‘ Useful for scanning tools and image documentation.
  
  
  π VOLUME β Define Persistent Storage Volumes πΎ
VOLUME ["/app/data"]
β
 What it does:
Creates a mount point with a persistent volume at build/run time.
π‘ Avoid putting app logic here; use it for data.
  
  
  π USER β Switch to a Non-root User π
RUN adduser -D myuser
USER myuser
β
 What it does:
Sets the user under which the container runs (for security best practices).
π‘ Donβt run production apps as
root.
π§ͺ BONUS: Multi-Stage Build Example π§
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Stage 2: Runtime
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app .
CMD ["npm", "start"]
β Why?
- Keep final image clean
- Remove dev dependencies
- Build-only stuff stays out of final image
β Summary Table
| Command | Purpose | 
|---|---|
| FROM | Set base image | 
| WORKDIR | Set working directory | 
| COPY | Copy files into image | 
| RUN | Execute shell commands at build time | 
| CMD | Run command on container start | 
| EXPOSE | Document listening port | 
| ENV | Set environment variables | 
| ARG | Pass build-time variables | 
| ENTRYPOINT | Set main executable | 
| LABEL | Add metadata to image | 
| USER | Switch to non-root user | 
| VOLUME | Declare persistent storage | 
 


 
    
Top comments (0)