假设我已经像这样提取了NVIDIA NGC PyTorch docker图像:docker pull nvcr.io/nvidia/pytorch:21.07-py3
然后我想添加这些python包:omegaconf wandb pycocotools
?
如何使用原始Docker映像和附加的Python包创建新的Docker映像?
另外,如何在整个组织中分发新映像?
创建名为Dockerfile
的文件。添加如下所示的行。
添加FROM
行来指定基本图像:
FROM nvcr.io/nvidia/pytorch:21.07-py3
升级Pip到最新版本:
RUN python -m pip install --upgrade pip
安装你需要的其他Python包:
RUN python -m pip install omegaconf wandb pycocotools
总之,Dockerfile看起来像这样:
FROM nvcr.io/nvidia/pytorch:21.07-py3
RUN python -m pip install --upgrade pip
RUN python -m pip install omegaconf wandb pycocotools
在与Dockerfile
相同的目录中,运行以下命令构建新映像,用您选择的名称替换my-new-image
:
docker build -t my-new-image .
这对我来说是有效的,但是Pip会生成一个关于以root用户安装包的警告。我发现最好还是忽略这个警告。请看这个答案末尾的注释来理解为什么。
新的docker映像现在应该出现在您的系统上:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-new-image latest 082f76972805 13 seconds ago 15.1GB
nvcr.io/nvidia/pytorch 21.07-py3 7beec3ff8d35 5 weeks ago 15GB
[...]
你现在可以运行新图像了。
$ docker run --gpus all -it --rm --ipc=host my-new-image
. .并验证它是否有额外的Python包:
# python -m pip list | grep 'omegaconf|wandb|pycocotools'
omegaconf 2.1.1
pycocotools 2.0+nv0.5.1
wandb 0.12.1
Docker Hub Repositories文档详细说明了以下步骤:
- 创建存储库(可能是私有的)
- 推送图片
- 添加合作者
- 从仓库中提取图像
注意:非root用户的问题:虽然它被认为是"最佳实践"。如果不能以root Docker用户运行Docker容器,在实际操作中,非root用户会增加一些复杂性。
你可以在docker文件中创建一个非root用户,命令行如下:
RUN useradd -ms /bin/bash myuser
USER myuser
ENV PATH "$PATH:/home/myuser/.local/bin"
但是,如果您使用-v
标志运行带有挂载卷的容器,那么myuser
将根据这些卷的userid或groupid是否与主机系统中的用户或组匹配来授予对这些卷的访问权限。您可以修改useradd
命令行来指定所需的用户id或组id,但是生成的映像当然不能移植到具有不同id的系统中。
此外,似乎有一个限制,阻止非root用户访问指向fscrypt
加密文件夹的挂载卷。但是,对于根docker用户,这对我来说工作得很好。
由于这些原因,我发现让容器作为根运行是最简单的。