用 Docker Compose 固化 Python 开发环境
【摘要】 把 Python 版本、依赖和测试环境固化到 Docker Compose,并记录缓存、挂载和生产镜像的常见用法。
“代码在我电脑上能跑”常见的原因不是代码不同,而是 Python 版本、系统库或依赖安装顺序不同。把开发环境写进 Docker Compose,可以让新成员用两条命令得到相同的运行条件。
先创建 Dockerfile:
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "-m", "pytest"]
把依赖安装放在复制源代码之前,可以复用 Docker 的层缓存。requirements.txt 没有变化时,修改业务代码不会重复下载依赖。PYTHONUNBUFFERED=1 让容器日志及时输出,排查启动问题时更直接。
再创建 compose.yaml:
services:
app:
build: .
working_dir: /app
volumes:
- .:/app
command: python -m pytest
日常使用时,先执行:
docker compose build
docker compose run --rm app
第一条命令构建镜像,第二条命令在临时容器中运行测试。需要开发服务时,把 command 改成项目启动命令,再执行 docker compose up。源代码通过绑定挂载进入容器,修改文件不需要重建镜像;依赖发生变化时,重新执行 docker compose build。
还要添加 .dockerignore,至少排除 .git、.venv、__pycache__ 和本地缓存。否则这些目录会增大构建上下文,甚至覆盖容器内的依赖。绑定挂载会覆盖 /app 下的同名内容,因此虚拟环境应留在宿主机项目目录之外,或者直接让容器管理依赖。
Compose 适合统一开发和测试条件,但不能保证生产环境完全一致。生产镜像应固定 Python 补丁版本或镜像摘要,去掉源代码挂载,并使用独立的启动命令。把这几项约定写进仓库后,环境问题就更容易复现,也更容易交给下一位开发者处理。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)