Docker中利用additional-contexts实现两个独立服务共享本地Python模块的配置问题
Docker中利用additional-contexts实现两个独立服务共享本地Python模块的配置问题
看起来你已经找对方向了,用additional-contexts确实是Docker Compose里实现跨服务共享本地代码的靠谱方案,我来帮你把剩下的配置补全,确保model-server和web-server都能顺利导入shared/models.py模块。
首先,我们先把docker-compose.yml的配置补全,给两个服务都配置好额外上下文:
name: my_docker services: model-server: build: context: ./model_server/app additional_contexts: # 给shared目录起个别名,后面Dockerfile里要用到这个名字 shared-ctx: ./shared dockerfile: Dockerfile args: INSTALL_DEV: "true" command: - python - run_model_server.py # 你的环境变量配置可以保留在这里 environment: # ... 你的原有配置内容 web-server: build: context: ./web_server/app additional_contexts: # 统一别名方便维护 shared-ctx: ./shared dockerfile: Dockerfile args: INSTALL_DEV: "true" command: - python - main.py environment: # ... 你的原有配置内容
接下来是关键步骤:修改两个服务的Dockerfile,把额外上下文里的shared目录内容复制到镜像中,并且让Python能正确找到这个模块。
以model_server/app/Dockerfile为例,添加以下配置:
# 保留你原有的依赖安装步骤 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt # 从额外上下文(别名shared-ctx)复制shared目录的所有内容到镜像的/app/shared路径下 # --from=shared-ctx 是指定从我们定义的额外上下文里读取内容 COPY --from=shared-ctx ./ /app/shared/ # 把当前工作目录加入Python的搜索路径,这样直接import models就能找到模块 ENV PYTHONPATH=/app # 复制你自己的应用代码到容器内 COPY ./app/ . # 保留你原有的启动命令配置
web_server/app/Dockerfile的修改逻辑完全一致,同样添加上述的COPY --from=shared-ctx和ENV PYTHONPATH配置即可。
最后给你几个小提醒:
additional-contexts里的路径是相对于docker-compose.yml所在目录的,你的项目结构里这个路径是正确的,不用调整- 测试的时候可以进入任意一个服务的容器,执行
python -c "import models; print(models.__file__)",如果能打印出模块的容器内路径,就说明配置成功了 - 如果后续
shared目录里新增子模块或依赖,这个配置也能自动覆盖,不用额外修改
备注:内容来源于stack exchange,提问作者oweydd
相关产品推荐
相关产品推荐

