如何在现有镜像的基础上创建新的docker镜像,但包含更多的Python包?



假设我已经像这样提取了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文档详细说明了以下步骤:

  1. 创建存储库(可能是私有的)
  2. 推送图片
  3. 添加合作者
  4. 从仓库中提取图像

注意:非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用户,这对我来说工作得很好。

由于这些原因,我发现让容器作为根运行是最简单的。

最新更新