如何为Docker Compose传环境变量并动态设置Rasa模型参数?
解决方案
要实现每次Docker重启时动态从GCS获取最新模型文件作为--model参数,需要调整三个文件的配置,具体步骤如下:
1. 修改Dockerfile,指定入口脚本
原来的Dockerfile未设置ENTRYPOINT,需要添加ENTRYPOINT指向你的entrypoint.sh,让它作为容器启动的入口,负责处理参数替换后再执行Rasa命令。
修改后的Dockerfile:
FROM rasa/rasa:3.1.0-full ADD . /app RUN whoami USER root RUN pip install google-cloud-storage # 给entrypoint.sh添加执行权限 RUN chmod +x /app/entrypoint.sh USER rasa # 设置entrypoint脚本,CMD作为默认参数传递给entrypoint ENTRYPOINT ["/app/entrypoint.sh"] CMD ["rasa", "run", "--enable-API", "--auth-token", "secret", "--model", "abc.gz"]
2. 修改entrypoint.sh,动态替换--model参数
在entrypoint.sh里获取到FILE_NAME后,遍历传入的命令参数,把原来的--model后面的值替换成最新的FILE_NAME,再执行修改后的命令。
修改后的entrypoint.sh:
#!/bin/sh # 使用环境变量替代硬编码,更灵活 BUCKET_NAME=${BUCKET_NAME:-gs://customer-service-rasa-models-staging} PROJECT_NAME=${PROJECT_NAME:-intelagent-dev} KEY_FILE=${KEY_FILE:-./dev.json} # LOGIN TO GCLOUD gcloud auth activate-service-account --project=$PROJECT_NAME --key-file=$KEY_FILE # 获取最新的模型文件名 FILE_NAME=$(gsutil ls -l $BUCKET_NAME | sort -k2 | tail -n2 | head -n1 | awk 'END {$1=$2=""; sub(/^[ \t]+/, ""); print }') echo "使用最新模型文件: $FILE_NAME" # 遍历传入的参数,替换--model的值 NEW_ARGS=() MODEL_FLAG=false for arg in "$@"; do if [ "$MODEL_FLAG" = true ]; then # 替换为获取到的FILE_NAME NEW_ARGS+=("$FILE_NAME") MODEL_FLAG=false elif [ "$arg" = "--model" ]; then NEW_ARGS+=("$arg") MODEL_FLAG=true else NEW_ARGS+=("$arg") fi done # 执行修改后的命令 exec "${NEW_ARGS[@]}"
这里做了两个优化:
- 用环境变量替代硬编码配置,和docker-compose里的环境变量对应,方便后续修改
- 自动识别
--model参数并替换其值,不需要修改原命令结构
3. 调整docker-compose.yml配置
保留原有command配置即可(entrypoint会自动替换--model的值),同时确保环境变量和entrypoint.sh里的变量对应:
修改后的docker-compose.yml:
version: '3.0' services: rasa: image: himanshu/rasa:dev ports: - 5005:5005 volumes: - ./:/app # 保留默认命令,entrypoint会替换--model的值 command: ["rasa", "run", "--enable-API", "--auth-token", "secret", "--model", "abc.gz"] environment: - GOOGLE_APPLICATION_CREDENTIALS=/app/dev.json - BUCKET_NAME=customer-service-rasa-models - PROJECT_NAME=intelagent-dev - KEY_FILE=/app/dev.json
验证步骤
- 重新构建镜像:
docker-compose build - 启动容器:
docker-compose up - 查看容器日志,会看到输出
使用最新模型文件: [你的GCS里的最新模型名],同时Rasa服务会加载这个最新模型
这样每次容器重启时,entrypoint.sh都会重新从GCS获取最新的模型文件名,自动替换--model参数的值,无需手动修改配置。
内容的提问来源于stack exchange,提问作者Himanshu Teotia
相关产品推荐
相关产品推荐

