如何在Monorepo中实现Python Docker服务间的代码共享
无版本化共享Monorepo中Python通用代码的容器化方案
给你几个实用的方案,不用把common代码版本化发布也能实现容器间共享:
1. 构建镜像时直接复制common目录
在每个服务的Dockerfile里,把根目录下的common复制到镜像内的项目路径中。比如service-a的Dockerfile可以这么写:
FROM python:3.11-slim WORKDIR /app # 从项目根目录复制common到镜像里 COPY ../common /app/common # 复制当前服务的代码 COPY . /app # 安装依赖、启动服务 RUN pip install -r requirements.txt CMD ["python", "main.py"]
构建镜像的时候,必须从project根目录执行命令,不然找不到common路径:
docker build -t service-a -f service-a/Dockerfile .
2. 开发阶段用绑定挂载实时同步
本地调试的时候,不用每次改完common代码就重新构建镜像,直接把宿主机的common目录挂载到容器里对应的位置:
docker run -v $(pwd)/common:/app/common -p 8000:8000 service-a
这样修改宿主机上的common代码,容器里能立刻生效,省了不少构建时间。
3. 把common做成可编辑Python包
在common目录下建个pyproject.toml或者setup.py,把它声明成一个Python包,不用发布到PyPI。比如pyproject.toml内容可以很简单:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "common" version = "0.1.0"
然后在service-a和service-b的requirements.txt里加上:
-e ../common
对应的Dockerfile调整成这样:
FROM python:3.11-slim WORKDIR /app # 先复制common的配置文件,安装可编辑包 COPY ../common/pyproject.toml /tmp/common/ RUN pip install -e /tmp/common # 再复制完整的common代码和服务代码 COPY ../common /tmp/common COPY . /app RUN pip install -r requirements.txt CMD ["python", "main.py"]
这样就能直接用from common.utils import xxx这种规范的导入方式,不用手动改Python路径。
4. 临时方案:手动添加Python模块路径
如果不想搞配置文件,可以在每个服务的启动脚本开头,把common目录加到Python的搜索路径里:
import sys from pathlib import Path # 计算common目录的绝对路径,适配项目结构 common_dir = Path(__file__).resolve().parent.parent / "common" sys.path.append(str(common_dir)) # 现在就能正常导入common里的模块了 from common.auth import verify_token
这种方式快是快,但如果项目结构变了,就得跟着改代码,适合临时用或者小型项目。
内容的提问来源于stack exchange,提问作者dendog
相关产品推荐
相关产品推荐

