
需求:部署一个基于 Flask 的 Python Web 应用,要求支持多阶段构建以减小镜像体积。
Dockerfile 实现:
# 第一阶段:构建环境
FROM python:3.9-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
# 第二阶段:运行时环境
FROM python:3.9-slim
WORKDIR /app
# 从 builder 阶段复制已安装的依赖
COPY --from=builder /root/.local /root/.local
COPY . .
# 确保脚本可执行
ENV PATH=/root/.local/bin:$PATH
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]运维要点:
--user 安装依赖避免全局污染。PATH 环境变量确保用户级安装的依赖可用。需求:部署一个 Node.js 微服务,需要区分开发和生产环境,并支持健康检查。
Dockerfile 实现:
FROM node:16-alpine as base
WORKDIR /usr/src/app
COPY package*.json ./
FROM base as dev
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
FROM base as prod
RUN npm ci --only=production
COPY . .
USER node
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "server.js"]运维要点:
npm ci 确保依赖版本锁定。需求:部署一个 Spring Boot 应用,需要优化 JVM 参数并支持配置文件外部化。
Dockerfile 实现:
# 使用官方 OpenJDK 镜像
FROM eclipse-temurin:17-jdk-jammy as builder
WORKDIR /workspace/app
COPY . .
RUN ./gradlew build
# 使用 distroless 镜像作为运行时
FROM gcr.io/distroless/java17-debian11
WORKDIR /app
COPY --from=builder /workspace/app/build/libs/*.jar app.jar
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
EXPOSE 8080
ENTRYPOINT ["java", "${JAVA_OPTS}", "-jar", "app.jar"]运维要点: