Dockerfile编写案例

wen java案例 1

本文目录导读:

Dockerfile编写案例

  1. 案例1:简单的Python Web应用
  2. 案例2:Node.js应用(多阶段构建)
  3. 案例3:Java Spring Boot应用(优化大小)
  4. 案例4:Go应用(极小镜像)
  5. 案例5:Python机器学习应用(带GPU支持)
  6. 案例6:最佳实践模板
  7. 关键最佳实践:

我来提供几个常见的Dockerfile编写案例,从简单到复杂。

案例1:简单的Python Web应用

# Python Web应用
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

案例2:Node.js应用(多阶段构建)

# 多阶段构建 - Node.js应用
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源代码
COPY . .
# 构建应用
RUN npm run build
# 生产阶段
FROM nginx:alpine
# 复制构建产物到nginx
COPY --from=builder /app/build /usr/share/nginx/html
# 复制nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

案例3:Java Spring Boot应用(优化大小)

# Java Spring Boot应用 - 使用JRE
FROM maven:3.8-openjdk-11 AS build
WORKDIR /app
# 复制pom.xml和源代码
COPY pom.xml .
COPY src ./src
# 构建应用(跳过测试)
RUN mvn package -DskipTests
# 运行阶段 - 使用轻量级JRE
FROM openjdk:11-jre-slim
WORKDIR /app
# 创建非root用户
RUN groupadd -r spring && useradd -r -g spring spring
# 复制jar包
COPY --from=build /app/target/*.jar app.jar
# 切换用户
USER spring
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

案例4:Go应用(极小镜像)

# Go应用 - 使用scratch生成极小镜像
# 构建阶段
FROM golang:1.18-alpine AS builder
WORKDIR /app
# 设置Go代理
ENV GOPROXY=https://goproxy.cn,direct
# 复制go.mod和go.sum
COPY go.mod go.sum ./
RUN go mod download
# 复制源代码
COPY . .
# 静态编译
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o main .
# 运行阶段 - 使用scratch最小镜像
FROM scratch
# 拷贝时区和证书
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/main /main
# 如果应用需要时区
# COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
EXPOSE 8080
ENTRYPOINT ["/main"]

案例5:Python机器学习应用(带GPU支持)

# 机器学习应用 - 带GPU支持
FROM tensorflow/tensorflow:2.9.2-gpu
# 设置环境
ENV PYTHONUNBUFFERED=1 \
    DEBIAN_FRONTEND=noninteractive
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libglib2.0-0 \
    && rm -rf /var/lib/apt/lists/*
# 复制依赖
COPY requirements.txt .
RUN pip install --upgrade pip \
    && pip install -r requirements.txt
# 复制模型和代码
COPY models/ ./models/
COPY src/ ./src/
EXPOSE 8501
# 启动Streamlit应用
CMD ["streamlit", "run", "src/app.py", "--server.port=8501"]

案例6:最佳实践模板

# ===== 最佳实践模板 =====
FROM ubuntu:22.04 AS base
# 元数据
LABEL maintainer="yourname@example.com" \
      version="1.0.0" \
      description="最佳实践示例"
# 避免交互式提问
ENV DEBIAN_FRONTEND=noninteractive \
    TZ=Asia/Shanghai
# 使用国内源(用于加速)
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
        curl \
        ca-certificates \
        tzdata \
    && ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 普通用户
RUN groupadd -r myapp && useradd -r -g myapp -s /sbin/nologin myapp
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8080/health || exit 1
# 切换用户
USER myapp
# 复制文件
COPY --chown=myapp:myapp . .
# 暴露端口
EXPOSE 8080
# 启动命令
CMD ["./start.sh"]

关键最佳实践:

构建优化

  • 合并RUN命令,减少层数
  • 利用Docker缓存(先复制依赖文件)
  • 使用.dockerignore排除不必要文件

.dockerignore文件

.git
node_modules
__pycache__
*.pyc
*.log
.env
.DS_Store
dist/
.vscode/

安全最佳实践

  • 使用非root用户运行
  • 使用轻量级基础镜像
  • 定期更新基础镜像
  • 不存储敏感信息

性能优化

  • 使用多阶段构建
  • 选择合适的镜像大小
  • 使用特定版本的依赖

调试技巧

# 进入容器调试
docker run -it --entrypoint /bin/bash image_name
# 查看构建历史
docker history image_name
# 多阶段构建查看中间层
docker build --target builder -t debug_image .

这些案例覆盖了常见的应用场景,可以根据实际需求调整使用,记得根据项目特点选择合适的Dockerfile编写策略。

抱歉,评论功能暂时关闭!