You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:10:36