# 阶段1: Maven构建
FROM maven:3.8-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests# 阶段2: JRE运行环境
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar ./app.jar
CMD ["java", "-jar", "app.jar"]
Node.js应用模板
# 阶段1: 安装依赖和构建
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build# 阶段2: 轻量运行环境
FROM node:18-alpine
WORKDIR /app
ENV NODE_ENV production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json ./
CMD ["node", "dist/index.js"]
Python应用模板
# 阶段1: 构建环境
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt# 阶段2: 运行环境
FROM python:3.11-alpine
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
1.3 多阶段构建性能优化
# 使用BuildKit缓存优化
# syntax=docker/dockerfile:1.4FROM node:18 AS builder
WORKDIR /app# 单独复制package.json利用缓存
COPY package*.json ./
RUN npm install# 然后复制其他文件
COPY . .# 使用缓存挂载加速构建
RUN --mount=type=cache,target=/root/.npm \npm run build
二、Alpine基础镜像深度优化
2.1 Alpine镜像核心优势
2.2 Alpine镜像优化策略
2.2.1 最小化安装
# 错误做法:安装不必要的文档和缓存
RUN apk add nginx# 正确做法:最小化安装
RUN apk add --no-cache --virtual .build-deps \build-base \linux-headers && \apk add --no-cache \nginx \&& apk del .build-deps
2.2.2 多阶段Alpine构建
# 阶段1: 使用完整Alpine构建
FROM alpine:3.19 AS builder
RUN apk add --no-cache build-base
COPY . /src
WORKDIR /src
RUN make# 阶段2: 使用最小Alpine运行
FROM alpine:3.19
COPY --from=builder /src/bin/app /usr/local/bin/app
CMD ["app"]
2.2.3 特定语言优化
# Python优化:使用py3-pip代替完整pip
RUN apk add --no-cache py3-pip && \pip install --no-cache-dir -r requirements.txt# Node.js优化:使用npm ci代替npm install
RUN npm ci --only=production --cache=/tmp/empty-cache
2.3 Alpine镜像问题解决方案
glibc兼容问题
# 安装glibc兼容层
RUN apk add --no-cache libc6-compat# 或使用alpine-glibc镜像
FROM frolvlad/alpine-glibc:alpine-3.19
时区设置
RUN apk add --no-cache tzdata && \cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone && \apk del tzdata
三、分层优化高级策略
3.1 分层原理深度解析
3.2 分层优化实战技巧
3.2.1 高效分层策略
# 优化前(5层)
FROM alpine:3.19
RUN apk update
RUN apk add curl
RUN curl -O https://example.com/file.tar.gz
RUN tar -xzf file.tar.gz
RUN rm file.tar.gz# 优化后(1层)
FROM alpine:3.19
RUN apk add --no-cache curl && \curl -O https://example.com/file.tar.gz && \tar -xzf file.tar.gz && \rm file.tar.gz
# 查看镜像层信息
docker history my-app:latest# 输出示例
IMAGE CREATED CREATED BY SIZE
sha256:... 2 hours ago CMD ["/app"] 0B
<missing>2 hours ago COPY ..# buildkit 4.2MB<missing>2 hours ago COPY --from=builder /app .12.3MB
<missing>2 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
7.2 运行时监控
# 查看容器资源使用
docker stats my-container# 输出示例
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O
a1b2c3d4e5f6 my-container 0.15% 45.32MiB / 1.944GiB 2.28% 1.24MB / 2.48MB