如何在Dockerfile的RUN命令中正确使用ARG变量?
问题:Dockerfile配置Python版本和requirements文件路径时出现"-r option requires 1 argument"错误
错误原因
你在FROM指令之前定义的REQUIREMENTS_FILE变量,在FROM之后的构建阶段不会自动继承。Docker中每个FROM都会开启一个新的构建阶段,阶段之间的ARG变量默认不共享,导致执行RUN python3 -m pip install -r $REQUIREMENTS_FILE时,$REQUIREMENTS_FILE为空,pip的-r选项没有获取到参数,因此报错。
另外需要注意:Docker构建时只能访问构建上下文目录(即docker build命令最后指定的路径)内的文件,如果你的requirements.txt在上级目录,必须确保它被包含在构建上下文中,否则容器内会找不到该文件。
解决方案
修正后的Dockerfile
在FROM之后重新声明REQUIREMENTS_FILE ARG,让当前构建阶段能继承全局定义的变量值:
ARG VERSION=3.9 ARG REQUIREMENTS_FILE="../requirements.txt" FROM python:$VERSION # 重新声明ARG,继承全局变量值 ARG REQUIREMENTS_FILE RUN python3 -m ensurepip # 用双引号包裹变量,避免路径含空格时出现问题 RUN python3 -m pip install -r "$REQUIREMENTS_FILE" CMD python3 -m pip freeze
构建命令调整
如果requirements.txt位于上级目录,需要将构建上下文指定为上级目录,同时调整REQUIREMENTS_FILE的路径为相对上下文的路径:
docker build -t myimage:1.0 --build-arg VERSION=3.10 --build-arg REQUIREMENTS_FILE="requirements.txt" ..
如果要以当前目录为构建上下文,需确保requirements.txt在当前目录或子目录中,此时构建命令可以保持原格式:
docker build -t myimage:1.0 --build-arg VERSION=3.10 --build-arg REQUIREMENTS_FILE="./requirements.txt" .
验证
构建完成后运行容器,执行以下命令查看已安装的依赖,确认配置生效:
docker run --rm myimage:1.0
内容的提问来源于stack exchange,提问作者Magyar_57
相关产品推荐
相关产品推荐

