Cách viết Dockerfile an toàn hơn
Nhiều Dockerfile mình review có lỗi bảo mật cơ bản. Đây là checklist mình dùng.
1. Không chạy root
# Bad
FROM node:20-alpine
COPY . .
CMD ["node", "app.js"]
# Container chạy bằng root!
# Good
FROM node:20-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY . .
USER appuser
CMD ["node", "app.js"]
Nếu app bị hack, attacker chỉ có quyền appuser, không phải root.
2. Pin exact versions
# Bad: image có thể thay đổi bất cứ lúc nào
FROM python:3
FROM node:latest
# Good: pin version
FROM python:3.12.4-slim-bookworm
FROM node:20.15.1-alpine3.20
latest hôm nay có thể khác latest ngày mai → build không reproducible.
3. Dùng slim/alpine base
# Big: ~900MB, nhiều packages không cần
FROM ubuntu:22.04
# Smaller: ~150MB
FROM python:3.12-slim
# Smallest: ~50MB
FROM python:3.12-alpine
Ít packages = ít attack surface = ít CVEs.
4. Multi-stage build
# Build stage: có compiler, build tools
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o server
# Runtime stage: chỉ có binary
FROM alpine:3.20
RUN apk --no-cache add ca-certificates
COPY /app/server /server
USER nobody
CMD ["/server"]
Build tools không vào production image.
5. Không copy secrets
# Bad: secrets baked vào image layer
COPY .env .
ENV API_KEY=secret123
# Good: pass at runtime
# docker run --env-file .env myapp
Ai pull image đều thấy secrets trong layers:
docker history myapp --no-trunc
6. COPY cụ thể, không COPY .
# Bad: copy everything kể cả .git, .env, node_modules
COPY . .
# Good: copy chỉ những gì cần
COPY package*.json ./
RUN npm ci --production
COPY src/ ./src/
COPY public/ ./public/
Kết hợp với .dockerignore:
.git
.env*
node_modules
tests
*.md
docker-compose*.yml
7. Health check
HEALTHCHECK \
CMD curl -f http://localhost:3000/health || exit 1
```
Orchestrator (Docker Swarm, K8s) dùng healthcheck để restart container khi app hang.
## 8. Scan for vulnerabilities
```bash
# Docker Scout
docker scout cves myapp:latest
# Trivy
trivy image myapp:latest
# Snyk
snyk container test myapp:latest
```
Chạy scan trong CI/CD, block deploy nếu có critical CVE.
## Checklist
- [ ] Không chạy root
- [ ] Pin exact image version
- [ ] Dùng slim/alpine base
- [ ] Multi-stage build
- [ ] .dockerignore đầy đủ
- [ ] Không có secrets trong image
- [ ] HEALTHCHECK
- [ ] Scan CVE trong CI/CD
---
Dockerfile của bạn check được mấy điểm? Có tip bảo mật nào khác không?
All rights reserved