【容器化进阶】第一篇:Dockerfile 精要 —— 彻底告别“环境不一致”
专栏进度:01 / 03 (Docker 专题)
你是否经历过安装 psycopg2 或 pandas 时,因为服务器缺少某个 C 语言库而折腾一个下午?
Docker 的核心价值在于:它将你的代码、解释器、依赖库、甚至操作系统配置,全部打成一个只读的 “镜像(Image)”。
一、 核心概念:分层存储与缓存机制
Docker 镜像不是一个大文件,而是像洋葱一样的一层层叠加。
缓存命中:如果你在 Dockerfile 中先复制 requirements.txt 再进行 pip install,只要你的依赖没变,Docker 就会直接跳过安装过程。
不可变性:一旦镜像构建完成,无论分发到哪台服务器,运行结果完全一致。
二、 实战:编写一个专业的 Python Dockerfile
反面教材(臃肿且缓慢):
Dockerfile
FROM python:3.9
COPY . /app
RUN pip install -r /app/requirements.txt # 每次改代码都会重新触发安装,慢死!
CMD [“python”, “/app/main.py”]
专家写法(精简且极速):
Dockerfile
- 选择轻量化基础镜像
FROM python:3.9-slim
- 设置工作目录
WORKDIR /app
- 先复制依赖清单(利用缓存)
COPY requirements.txt .
- 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
- 复制业务代码(变动最频繁的部分放在最后)
COPY . .
- 设置非 root 用户(出于安全性考虑)
RUN useradd -m myuser
USER myuser
CMD [“python”, “main.py”]
三、 镜像瘦身:多阶段构建(Multi-stage Builds
)
有些编译工具(如 gcc)只在安装包时有用,运行代码时完全是赘肉。
Dockerfile
阶段一:构建环境
FROM python:3.9-slim AS builder
RUN apt-get update && apt-get install -y gcc
COPY requirements.txt .
RUN pip install --user -r requirements.txt
阶段二:运行环境
FROM python:3.9-slim
WORKDIR /app
仅仅从 builder 阶段拷贝安装好的包,不带走 gcc 等垃圾
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD [“python”, “main.py”]
四、 避坑指南:.dockerignore 是必须的
很多新手会把 .git、pycache 甚至是本地的 .env 敏感文件也打进镜像。这不仅增加了体积,还泄露了密钥。
动作建议:在项目根目录建立 .dockerignore,排除一切不需要的文件。
更多推荐
所有评论(0)