Dockerfile là script mô tả cách build image, và mỗi instruction sinh ra một layer được cache.
Nguyên tắc quan trọng nhất: đặt thứ ít thay đổi lên trước.
dockerfile
FROM node:20-alpine
WORKDIR /app
# copy manifest trước để layer npm install được tái dùng
COPY package*.json ./
RUN npm ci
# source đổi thường xuyên nên để sau cùng
COPY . .
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget -q -O /dev/null http://localhost:3000/health || exit 1
ENTRYPOINT ["node"]
CMD ["server.js"]- Layer caching: source đổi mà
package.jsonkhông đổi thì Docker dùng lại layernpm ciđã cache — tiết kiệm 1-2 phút mỗi lần build. .dockerignore: loạinode_modules,.git,.env, build artifact ra khỏi build context, vừa nhanh vừa đỡ lọt file nhạy cảm.- Non-root user: mặc định container chạy bằng root, có lỗ hổng là mất luôn — thêm
USER appusertrướcCMDtheo nguyên tắc đặc quyền tối thiểu. HEALTHCHECK: để Docker/K8s biết container đã healthy chưa mà route traffic vào.CMDvsENTRYPOINT:ENTRYPOINTlà executable không override được (tham số củadocker run image argssẽ được truyền vào nó), cònCMDchỉ là tham số mặc định và override được. Ghép như trên thì đổi được file chạy nhưng không đổi được runtime.- Gộp
RUNvà dọn trong cùng layer:RUN apt-get update && apt-get install -y ... && rm -rf /var/lib/apt/lists/*— dọn ở layer khác thì layer cũ vẫn nặng nguyên.