向Docker传递URL和目录路径时Python报list index out of range如何解决
你遇到的list index out of range错误本质是Python脚本接收到的入参数量不足,由多处配置错误共同导致,修复步骤如下:
1 修复Python脚本
你的代码漏了sys模块导入,首先补充该声明:
import sys # 缺失的导入语句 def do_somthing(url, dir_path): #do something! if __name__=="__main__": dir_path = sys.argv[1] url = sys.argv[2] do_somthing(url, dir_path)
2 修复shell脚本(test.sh)
原有两个核心配置错误:
getopts规则中,需要接收参数的选项后要加:才能正常读取$OPTARG的值- 不存在
$4变量,处理完选项参数后直接取剩余的位置参数作为URL即可
修复后代码:
#!/bin/bash while getopts 'i:' OPTION; do # 增加i后的冒号,表示该选项需要接参数 case $OPTION in i) dir_pth=$OPTARG;; esac done # 移除已处理的选项参数,让位置指针指向URL参数 shift $((OPTIND - 1)) url=$1 # 按Python脚本的参数顺序传值:先传目录路径,再传URL python python_fun.py $dir_pth $url
3 修正Dockerfile配置
你原来把脚本调用写在RUN指令里,这是镜像构建阶段执行的命令,无法接收运行容器时的动态参数。应该把执行逻辑设为容器启动命令,Dockerfile参考配置:
# 基础镜像、安装依赖等前置步骤自行补充 COPY python_fun.py . COPY test.sh . RUN chmod +x test.sh # 设置启动命令,固定目录路径,容器运行时只需传入URL ENTRYPOINT ["./test.sh", "-i", "/module/testdata/results/"]
4 修正Docker构建&运行命令
构建命令保持不变:
docker build -t myaccount/docker_name:latest .
运行容器时传入URL参数即可:
docker run --rm myaccount/docker_name:latest "你需要传入的下载URL"
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

