如何配置Docker高效开发两个依赖的Python多仓库项目?
配置Docker高效开发存在依赖关系的两个Python仓库
核心方案
通过多阶段Docker构建区分开发/生产环境,结合本地目录挂载实现开发阶段热重载,生产阶段构建完全独立的镜像,同时兼容依赖未发布时的本地迭代需求。
步骤1:编写适配双场景的Dockerfile
在runtime/Dockerfile中编写多阶段构建配置,分别适配开发和生产:
# 基础镜像(开发/生产共用) FROM python:3.11-slim AS base WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 开发阶段镜像 FROM base AS dev # 安装热重载工具(示例为FastAPI用的uvicorn,可根据项目调整) RUN pip install --no-cache-dir uvicorn[standard] # 开启Python无缓冲输出,确保日志实时打印 ENV PYTHONUNBUFFERED=1 # 带热重载的启动命令(根据项目实际启动方式修改) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] # 生产阶段镜像 FROM base AS prod # 复制runtime项目代码到镜像内 COPY . . # 依赖正式发布后,替换为官方包安装命令 # RUN pip install --no-cache-dir framework==1.0.0 # 生产环境启动命令(关闭热重载) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
步骤2:用Docker Compose实现开发阶段挂载
在dev目录下创建docker-compose.yml,将本地framework和runtime挂载到容器中:
version: '3.8' services: runtime-dev: build: context: ./runtime target: dev volumes: # 挂载本地runtime代码,修改后实时同步到容器 - ./runtime:/app # 挂载本地framework到容器的Python包目录,等效于pip install -e的效果 - ./framework:/usr/local/lib/python3.11/site-packages/framework ports: - "8000:8000" environment: - PYTHONPATH=/usr/local/lib/python3.11/site-packages
注意:容器内的Python包路径需与镜像中的Python版本匹配,可通过
docker exec <容器ID> python -c "import sys; print(sys.path)"确认实际路径。
步骤3:开发阶段快速迭代流程
- 修改
framework或runtime代码后,容器会自动触发热重载(前提是启动命令带--reload参数) - 单元测试可直接在容器内执行:
docker exec -it runtime-dev python -m pytest tests/
步骤4:生产阶段构建独立镜像
当framework正式发布后,更新runtime/Dockerfile的生产阶段,添加官方包安装命令,然后执行构建:
docker build --target prod -t runtime-prod ./runtime
构建出的镜像不依赖本地目录,可直接部署到生产环境。
依赖未发布时的CI/CD临时方案(可选)
若CI/CD需要提前测试,可在流水线中先将本地framework打包为wheel包,再安装到runtime:
# CI流水线执行步骤 cd framework python setup.py sdist bdist_wheel cd ../runtime pip install ../framework/dist/framework-0.1.0.tar.gz # 构建生产镜像 docker build --target prod -t runtime-prod ./runtime
内容的提问来源于stack exchange,提问作者C. Claudio
相关产品推荐
相关产品推荐

