如何解决docker-compose执行Python脚本时出现的Permission Errors错误
问题描述
我尝试使用docker-compose运行RL软件,已成功创建过基础docker容器、使用过docker-compose,但相关经验不算丰富。
按照对应仓库README的安装流程,我已成功构建了docker镜像,下一步需要执行Python脚本为容器安装额外组件,执行命令如下:
docker-compose exec app pip3 install -e ./environments/sushigo
执行bash ./scripts/install_env.sh sushigo时,我收到提示Defaulting to user installation because normal site-packages is not writeable,脚本继续运行几行后出现如下报错:
Installing collected packages: sushigo Running setup.py develop for sushigo ERROR: Command errored out with exit status 1: command: /usr/bin/python3 -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/app/environments/sushigo/setup.py'"'"'; __file__='"'"'/app/environments/sushigo/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps --user --prefix= cwd: /app/environments/sushigo/ Complete output (4 lines): running develop running egg_info creating sushigo.egg-info error: could not create 'sushigo.egg-info': Permission denied ---------------------------------------- ERROR: Command errored out with exit status 1: /usr/bin/python3 -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/app/environments/sushigo/setup.py'"'"'; __file__='"'"'/app/environments/sushigo/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps --user --prefix= Check the logs for full command output.
我的docker-compose.yml配置如下:
services: app: build: context: ./ dockerfile: app/Dockerfile ports: - 8899:8899 - 6006:6006 volumes: - ./app/:/app/ tty: true container_name: selfplay cap_add: - SYS_PTRACE
我猜测是Python没有在容器内写入额外文件的权限,请问该如何避免该错误?
补充信息:
- 我全程使用root用户操作
- 运行环境为WSL2下的Ubuntu系统
解决方案
报错的核心原因是WSL2宿主机挂载到容器内的目录权限不匹配,本地./app目录的UID/GID和容器内执行pip命令的用户UID/GID不一致,导致容器内用户没有挂载目录的写入权限,无法创建安装需要的.egg-info目录。可通过以下任意一种方法解决:
- 方法1:执行命令时指定root用户运行
在原exec命令中添加--user root参数,直接用容器内root权限执行安装:
docker-compose exec --user root app pip3 install -e ./environments/sushigo
如果要执行安装脚本,可先进入root权限的容器终端再操作:
docker-compose exec --user root app bash ./scripts/install_env.sh sushigo
- 方法2:修改docker-compose配置,指定容器默认以root运行
在docker-compose.yml的app服务配置中新增user: root字段,修改后配置如下:
services: app: build: context: ./ dockerfile: app/Dockerfile user: root # 新增本行配置 ports: - 8899:8899 - 6006:6006 volumes: - ./app/:/app/ tty: true container_name: selfplay cap_add: - SYS_PTRACE
修改完成后执行docker-compose up -d --force-recreate重启容器,再执行安装命令即可正常运行。
- 方法3:修改宿主机挂载目录权限
在WSL2的宿主机项目目录下执行命令放开目录写入权限:
chmod -R 777 ./app
该方法无需修改容器配置,操作最简单,但仅适合本地开发环境使用。
内容的提问来源于stack exchange,提问作者sovnheim
相关产品推荐
相关产品推荐

