Docker部署Rasa时pip安装依赖遇权限拒绝错误求助
解决Docker构建中pip安装权限拒绝问题
相关文件内容
entrypoint.sh脚本
#!/bin/sh # const variables BUCKET_NAME=gs://rasa-models-staging PROJECT_NAME=stage KEY_FILE=./stage.json # install dependencies pip install google-cloud-storage # Login to gscloud gcloud auth activate-service-account --project=$PROJECT_NAME --key-file=$KEY_FILE # Run gsutil command FILE_NAME=`gsutil ls -l $BUCKET_NAME | sort -k2 | tail -n2 | head -n1 | awk 'END {$1=$2=""; sub(/^[ \t]+/, ""); print }'` # if file not found then set default file name if [ -z "$FILE_NAME" ]; then FILE_NAME='/app/default_models/default.tar.gz' fi echo $FILE_NAME # Then run the CMD exec "$@"
DockerFile内容
FROM rasa/rasa:3.1.0-full ADD . /app RUN whoami USER root COPY entrypoint.sh /app/entrypoint.sh RUN [ "chmod", "+x", "/app/entrypoint.sh" ] ENTRYPOINT [ "/app/entrypoint.sh" ] USER rasa CMD ["/bin/bash", "-c" "run --enable-API --auth-token secret --model $FILE_NAME"]
问题描述
尝试过多种方式重构Dockerfile,包括安装google-cloud-storage时添加--user参数,但均未解决问题。执行docker compose up时出现权限拒绝错误。
错误信息
Could not install packages due to an OSError: [Errno 13] Permission denied: '/opt/venv/lib/python3.8/site-packages/googleapis_common_protos-1.56.4-py3.10-nspkg.pth'
解决方案
核心问题原因
当前pip install google-cloud-storage是在容器运行阶段以rasa用户执行的,而/opt/venv目录属于root用户,rasa没有写入权限,导致安装失败。
具体修复步骤
- 将依赖安装移至Docker构建阶段:在Dockerfile中以
root用户身份安装google-cloud-storage,避免运行时权限问题。 - 修正CMD的格式错误:原CMD数组中
-c后的命令应该作为单个字符串元素,否则会解析失败。 - 确保密钥文件权限正确:给
rasa用户授予key文件的读取权限。
修改后的Dockerfile:
FROM rasa/rasa:3.1.0-full ADD . /app # 以root身份安装依赖并调整权限 USER root # 安装google-cloud-storage到系统venv RUN pip install google-cloud-storage COPY entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh # 确保rasa用户能读取密钥文件 RUN chown rasa:rasa /app/stage.json ENTRYPOINT [ "/app/entrypoint.sh" ] USER rasa # 修正CMD格式,将命令作为单个字符串传给bash -c CMD ["/bin/bash", "-c", "run --enable-API --auth-token secret --model $FILE_NAME"]
修改后的entrypoint.sh(移除pip安装步骤):
#!/bin/sh # const variables BUCKET_NAME=gs://rasa-models-staging PROJECT_NAME=stage KEY_FILE=./stage.json # Login to gscloud gcloud auth activate-service-account --project=$PROJECT_NAME --key-file=$KEY_FILE # Run gsutil command FILE_NAME=`gsutil ls -l $BUCKET_NAME | sort -k2 | tail -n2 | head -n1 | awk 'END {$1=$2=""; sub(/^[ \t]+/, ""); print }'` # if file not found then set default file name if [ -z "$FILE_NAME" ]; then FILE_NAME='/app/default_models/default.tar.gz' fi echo $FILE_NAME # Then run the CMD exec "$@"
额外说明
- 构建阶段安装依赖可以减少容器运行时的开销,同时避免权限问题。
- 如果需要在运行时动态安装依赖,可考虑使用
pip install --user将包安装到rasa用户的home目录(~/.local/lib/python/site-packages),但这种方式可能会导致环境不一致,推荐优先在构建阶段安装。
内容的提问来源于stack exchange,提问作者Himanshu Teotia
相关产品推荐
相关产品推荐

