如何在 Dockerfile 的 RUN 命令中使用 ARG 变量?

问题描述 投票:0回答:1

我正在编写一个 Dockerfile,其中我希望 python 版本和需求文件是可配置的。如下:

ARG VERSION=3.9
ARG REQUIREMENTS_FILE="../requirements.txt"

FROM python:$VERSION

RUN python3 -m ensurepip
RUN python3 -m pip install -r $REQUIREMENTS_FILE

CMD python3 -m pip freeze

但是,当我构建图像时(

docker build -t myimage:1.0 --build-arg VERSION=3.10 --build-arg REQUIREMENTS_FILE="../requirements.txt" .
),我收到以下错误:

 => ERROR [3/3] RUN python3 -m pip install -r $REQUIREMENTS_FILE                                                                   0.6s
------                                                                                                                                  
 > [3/3] RUN python3 -m pip install -r $REQUIREMENTS_FILE:                                                                              
0.539                                                                                                                                   
0.539 Usage:                                                                                                                            
0.539   /usr/local/bin/python3 -m pip install [options] <requirement specifier> [package-index-options] ...                             
0.539   /usr/local/bin/python3 -m pip install [options] -r <requirements file> [package-index-options] ...                              
0.539   /usr/local/bin/python3 -m pip install [options] [-e] <vcs project url> ...
0.539   /usr/local/bin/python3 -m pip install [options] [-e] <local project path> ...
0.539   /usr/local/bin/python3 -m pip install [options] <archive url/path> ...
0.539 
0.539 -r option requires 1 argument
------
Dockerfile:7
--------------------
   5 |     
   6 |     RUN python3 -m ensurepip
   7 | >>> RUN python3 -m pip install -r $REQUIREMENTS_FILE
   8 |     
   9 |     CMD python3 -m pip freeze
--------------------
ERROR: failed to solve: process "/bin/sh -c python3 -m pip install -r $REQUIREMENTS_FILE" did not complete successfully: exit code: 2

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/lgd2p5onypc74hsljarhv7a9o

该 URL 导致与之前打印的相同错误。

我从 shell 脚本构建此图像,但错误与 CLI 相同。我也尝试使用 ${REQUIREMENTS_FILE} 和数组:

RUN ["python3", "-m", "pip", "install", "-r", $REQUIREMENTS_FILE]
,但没有任何效果。 我正在尝试做的事情可能吗?

python-3.x docker pip dockerfile
1个回答
0
投票

Args 的作用域为定义它们的阶段,并且在文件顶部,它们仅为 FROM 行定义。所以你需要将其向下移动:

ARG VERSION=3.9

FROM python:$VERSION

ARG REQUIREMENTS_FILE="../requirements.txt"
RUN python3 -m ensurepip
RUN python3 -m pip install -r $REQUIREMENTS_FILE

CMD python3 -m pip freeze

然后你会遇到下一个问题,即图像中不存在该文件。您将需要了解构建上下文和 COPY 命令以获取更多信息。

我尝试使用......数组:

RUN ["python3", "-m", "pip", "install", "-r", $REQUIREMENTS_FILE]

这永远不会起作用,因为 docker 不会在 RUN 步骤中扩展构建参数,它只是将它们作为环境变量传递。您需要一个 shell 来扩展环境变量,并且 json 数组语法(又名 exec 语法)无需 shell 即可显式运行该步骤。

© www.soinside.com 2019 - 2024. All rights reserved.