我正在编写一个Dockerfile,它需要安装不同的pip轮子,具体取决于基本映像中安装的PyTorch版本和CUDA版本:
RUN pip install torch-scatter -f https://data.pyg.org/whl/torch-${TORCH}+${CUDA}.html
RUN pip install torch-sparse -f https://data.pyg.org/whl/torch-${TORCH}+${CUDA}.html
因此,我需要在构建时将这些版本捕获到环境变量TORCH
和CUDA
中。
我知道我可以在Dockerfile中使用ENV
命令来分配给环境变量:
ENV TORCH=1.12.0
ENV CUDA=113
(注意,与TORCH
不同,CUDA
不能包含任何点(,然后构建容器。现在,如果我登录到正在运行的Docker容器,我可以从命令行获得以下版本:
python -c "import torch; print(torch.__version__)"
>>> 1.12.0
python -c "import torch; print(torch.version.cuda)"
>>> 11.3
然而,我不想对Dockerfile中的版本进行硬编码,因为如果我更改基本图像,硬编码的值将是错误的,我会尝试安装错误的轮子,安装将失败。我想在构建时找到它们,并将它们分配给TORCH
&CUDA
。我该怎么做?
您可以使用普通的shell语法在RUN
命令中设置环境变量,但这些设置在该命令结束时会丢失。因此,在单个RUN
命令中您可以使用shell命令替换来设置环境变量并使用它,但在该命令之后,它的值将不再可用。
# all within a single RUN line
RUN TORCH=$(python -c "import torch; print(torch.__version__)");
CUDA=$(python -c "import torch; print(torch.version.cuda)" | sed 's/.//g');
pip install torch-scatter -f https://data.pyg.org/whl/torch-${TORCH}+${CUDA}.html;
pip install torch-sparse -f https://data.pyg.org/whl/torch-${TORCH}+${CUDA}.html