You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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没有写入权限,导致安装失败。

具体修复步骤

  1. 将依赖安装移至Docker构建阶段:在Dockerfile中以root用户身份安装google-cloud-storage,避免运行时权限问题。
  2. 修正CMD的格式错误:原CMD数组中-c后的命令应该作为单个字符串元素,否则会解析失败。
  3. 确保密钥文件权限正确:给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:51:13