如何在自有Docker容器中调用PyTorch Docker镜像?
问题描述
我有一个依赖PyTorch库运行的应用,已在本地安装PyTorch。现需部署该应用并在容器内使用PyTorch,计划通过Docker Compose关联预构建的PyTorch Docker镜像。
我的Docker Compose配置如下:
version: '3' services: myapp: build: . image: myapp:latest environment: - PYTHONPATH=/usr/local/lib/python3.9/site-packages volumes: - ./src:/app/src - ./data:/app/data ports: - "8000:8000" depends_on: - pytorch pytorch: image: pytorch/pytorch:latest
运行时出现错误:
ModuleNotFoundError: No module named 'torch'
已知depends_on仅控制容器启动顺序,无法让应用容器直接使用PyTorch镜像的环境,且不想基于PyTorch镜像构建新容器或镜像,需要让自有容器直接使用PyTorch镜像的依赖。
解决方案
容器默认是完全隔离的,要让自有容器使用PyTorch镜像的依赖,可通过共享命名卷传递PyTorch的Python包实现,无需修改自有应用的Dockerfile:
修改后的Docker Compose配置
version: '3' volumes: torch_libs: # 定义存储PyTorch依赖的命名卷 services: myapp: build: . image: myapp:latest environment: # 将共享卷路径添加到PYTHONPATH,让Python能找到torch模块 - PYTHONPATH=/torch_libs:/app volumes: - ./src:/app/src - ./data:/app/data - torch_libs:/torch_libs # 挂载共享卷到应用容器 ports: - "8000:8000" depends_on: - pytorch # 可选:确保PyTorch容器完成依赖复制后再启动应用(需提前在应用镜像中安装wait-for-it) command: ["sh", "-c", "wait-for-it pytorch:80 -- python /app/src/main.py"] pytorch: image: pytorch/pytorch:latest volumes: - torch_libs:/torch_libs # 挂载共享卷 # 启动时复制PyTorch相关包到共享卷,再保持容器运行 command: ["sh", "-c", "cp -r /usr/local/lib/python3.9/site-packages/torch* /torch_libs/ && tail -f /dev/null"]
关键逻辑说明
- 命名卷
torch_libs:作为PyTorch容器和应用容器之间的依赖共享载体,避免直接依赖容器内部的文件系统。 - PyTorch容器的命令:启动后先将
torch相关的包复制到共享卷,再用tail -f /dev/null维持容器运行(否则复制完成后容器会直接退出)。 - 应用容器的PYTHONPATH:添加
/torch_libs路径,让Python解释器能识别到该目录下的torch模块。 - wait-for-it工具(可选):如果需要严格保证依赖复制完成后再启动应用,可在应用镜像中安装该工具,替代简单的
depends_on等待。
内容的提问来源于stack exchange,提问作者Nurislom Rakhmatullaev
相关产品推荐
相关产品推荐

