我正在编写一个 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]
,但没有任何效果。
我正在尝试做的事情可能吗?
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 即可显式运行该步骤。