# === 构建阶段 ===
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o app .
# === 运行阶段 ===
FROM alpine:3.19
RUN apk add --no-cache ca-certificates tzdata
RUN adduser -D -u 1000 appuser
USER appuser
COPY --from=builder /app/app /app/
EXPOSE 8080
CMD ["/app/app"]
最终镜像只有几十 MB,不包含 Go 工具链。
FROM node:20-alpine
WORKDIR /app
# 1. 先复制依赖描述文件 (利用缓存)
COPY package.json package-lock.json ./
RUN npm ci --production
# 2. 再复制源码 (变更频繁)
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
RUN cmd1 && cmd2 减少层数apt-get clean && rm -rf /var/lib/apt/lists/*HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget -qO- http://localhost:8080/health || exit 1
# 检查镜像层
docker history myapp:latest
docker history --no-trunc myapp:latest
# 分析镜像大小
dive myapp:latest # 镜像层分析工具
# 进入构建中间层
docker run --rm -it <sha256_hash> sh