从Docker镜像创建Singularity容器后无法找到MuJoCo二进制文件
Docker转Singularity容器后MuJoCo依赖报错问题
我将Docker镜像转换为Singularity容器后,出现了Docker环境中未发生的依赖错误。
Docker镜像构建代码
FROM ubuntu:22.04 WORKDIR /app SHELL ["/bin/bash", "-c"] RUN echo "Hello World!" RUN apt-get update && apt-get install -y \ libosmesa6-dev \ sudo \ wget \ curl \ unzip \ gcc \ g++ \ && apt-get install \ libosmesa6-dev \ && rm -rf /var/lib/apt/lists/* ENV DEBIAN_FRONTEND=noninteractive ENV PATH="/miniconda3/bin:${PATH}" ARG PATH="/miniconda3/bin:${PATH}" RUN cd / \ && mkdir -p /miniconda3 \ && wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /miniconda3/miniconda.sh \ && bash /miniconda3/miniconda.sh -b -u -p /miniconda3 \ && /miniconda3/bin/conda init bash \ && source ~/.bashrc \ && conda init \ && conda create -y -n myenv python=3.8 \ && conda update -y conda WORKDIR /~ RUN wget https://roboti.us/download/mjpro150_linux.zip \ && unzip mjpro150_linux.zip \ && mkdir ~/.mujoco \ && mv mjpro150 ~/.mujoco \ && wget https://roboti.us/file/mjkey.txt \ && mv mjkey.txt ~/.mujoco \ && rm mjpro150_linux.zip RUN cd /miniconda3/envs/myenv/lib/ && mv libstdc++.so.6 libstdc++.so.6.old && ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6 SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"] EXPOSE 5003 RUN pip install --no-cache-dir "Cython<3" \ && pip install mujoco-py==1.50.1.0 \ && pip install gym
Docker镜像构建、运行及测试
执行以下命令构建并运行Docker容器:
docker build -t dockercontainer:latest . docker run -it dockercontainer:latest
进入容器后执行测试命令,可正常运行(仅少量警告):
conda run -n myenv python -c"import gym; gym.make('Humanoid-v3')"
Singularity容器构建与运行
从Docker镜像构建Singularity容器:
singularity build singularity_container.sif docker-daemon://dockercontainer:latest
运行Singularity容器时执行测试命令:
singularity exec singularity_container.sif conda run -n myenv python -c"import gym; gym.make('Humanoid-v3')"
报错信息
File "/home/thoma/.local/lib/python3.8/site-packages/mujoco_py/config.py", line 37, in init_config raise error.MujocoDependencyError('Found your MuJoCo license key but not binaries. Please put your binaries into ~/.mujoco/mjpro131 or set MUJOCO_PY_MJPRO_PATH. Follow the instructions on https://github.com/openai/mujoco-py for setup.') mujoco_py.error.MujocoDependencyError: Found your MuJoCo license key but not binaries. Please put your binaries into ~/.mujoco/mjpro131 or set MUJOCO_PY_MJPRO_PATH. Follow the instructions on https://github.com/openai/mujoco-py for setup. ERROR conda.cli.main_run:execute(124): `conda run python -cimport gym; gym.make('Humanoid-v3')` failed. (See above for error)
问题原因及解决方案
核心原因
- Singularity目录绑定特性:Singularity默认会绑定宿主的
~/.mujoco目录到容器内,覆盖容器中预先安装的mjpro150文件,导致容器无法找到正确的二进制文件。 - 版本路径不匹配:mujoco-py v1.50.1.0默认查找
mjpro131,但你安装的是mjpro150,未明确指定路径时会触发版本不匹配报错。
解决方法
方法1:运行时禁用宿主目录绑定
执行Singularity命令时添加--no-home参数,避免宿主home目录覆盖容器内的目录:
singularity exec --no-home singularity_container.sif conda run -n myenv python -c"import gym; gym.make('Humanoid-v3')"
或仅排除~/.mujoco的绑定:
singularity exec --bind '~/.mujoco:/dev/null' singularity_container.sif conda run -n myenv python -c"import gym; gym.make('Humanoid-v3')"
方法2:在Docker镜像中预设环境变量
修改Dockerfile,添加环境变量明确指定MuJoCo路径,避免依赖默认查找逻辑:
# 在Dockerfile中添加以下内容(建议放在安装MuJoCo之后) ENV MUJOCO_PY_MJPRO_PATH="/root/.mujoco/mjpro150" ENV LD_LIBRARY_PATH="/root/.mujoco/mjpro150/bin:${LD_LIBRARY_PATH}"
重新构建Docker镜像后再转换为Singularity容器。
方法3:运行时临时指定环境变量
直接在Singularity命令中设置环境变量,清除宿主环境干扰:
singularity exec -e singularity_container.sif bash -c "export MUJOCO_PY_MJPRO_PATH=/root/.mujoco/mjpro150 && export LD_LIBRARY_PATH=/root/.mujoco/mjpro150/bin:\$LD_LIBRARY_PATH && conda run -n myenv python -c'import gym; gym.make(\"Humanoid-v3\")'"
其中-e参数会隔离宿主环境变量,防止冲突。
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

