本文目录导读:

- 案例1:简单的Python Web应用
- 案例2:Node.js应用(多阶段构建)
- 案例3:Java Spring Boot应用(优化大小)
- 案例4:Go应用(极小镜像)
- 案例5:Python机器学习应用(带GPU支持)
- 案例6:最佳实践模板
- 关键最佳实践:
我来提供几个常见的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编写策略。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播