通过Pip安装ElegantRL后在Docker镜像中执行时无法找到该包
问题:Docker容器中已安装的ElegantRL包无法被Python导入
用户使用以下Dockerfile构建镜像:
# Base image FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel # Set working directory WORKDIR /workspace ENV HOME=/workspace # Add our job's file to this directory ADD . /workspace RUN chown -R 42420:42420 /workspace # Install required packages and libraries RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub && apt update RUN apt install -y git RUN pip install git+https://github.com/AI4Finance-Foundation/ElegantRL # Run your job (Optional. You can specify your file when launching the AI Training job) CMD ["python", "/workspace/script.py"]
执行命令sudo docker run --rm -it --user=42420:42420 myimage后,出现报错:
File "/workspace/script.py", line 7, in <module> import elegantrl ModuleNotFoundError: No module named 'elegantrl'
其中script.py仅包含import elegantrl语句,为何已通过Pip安装的ElegantRL包无法被找到?
原因及解决办法
原因
Dockerfile中执行pip install时是以root用户操作的,pip默认会将包安装到系统级Python目录(如/usr/local/lib/python3.x/site-packages)。当切换到非root用户42420运行容器时,该用户要么没有权限访问系统级Python目录,要么当前Python环境的模块搜索路径未包含这个目录,导致无法找到已安装的ElegantRL包。
解决办法
有两种简单可行的修复方式:
- 使用
--user参数安装到用户目录
修改Dockerfile中的pip安装命令,加上--user参数,让pip将包安装到当前用户的HOME目录下(由于设置了ENV HOME=/workspace,最终会安装到/workspace/.local/lib/python...),而该目录的权限已经通过chown设置为42420用户所有,切换用户后可以正常访问:
RUN pip install --user git+https://github.com/AI4Finance-Foundation/ElegantRL
- 设置PYTHONPATH环境变量
如果坚持要安装到系统级目录,可以在Dockerfile中添加环境变量,让非root用户的Python能搜索到系统级包路径:
ENV PYTHONPATH=/usr/local/lib/python3.8/site-packages:$PYTHONPATH
(注意:路径中的Python版本号需要和基础镜像中的版本对应,比如pytorch 1.10.0对应的Python是3.8,可根据实际情况调整)
内容的提问来源于stack exchange,提问作者Addon
相关产品推荐
相关产品推荐

