“docker:19.03-dind”无法选择具有以下功能的设备驱动程序“nvidia”:[[gpu]]

Elo*_*zos 2 gpu docker kubernetes nvidia-docker docker-in-docker

我遇到了 K8S+DinD 问题:

  • 启动 Kubernetes 集群
  • 在该集群内启动一个主 docker 镜像和一个 DinD 镜像
  • 运行请求 GPU 的作业时出现错误could not select device driver "nvidia" with capabilities: [[gpu]]

完全错误

http://localhost:2375/v1.40/containers/long-hash-string/start: Internal Server Error ("could not select device driver "nvidia" with capabilities: [[gpu]]")
Run Code Online (Sandbox Code Playgroud)

execK8S pod 内的 DinD 映像nvidia-smi不可用。

一些调试,似乎是由于 DinD 缺少 Nvidia-docker-toolkit,当我直接在本地笔记本电脑 docker 上运行相同的作业时,我遇到了相同的错误,我通过安装nvidia-docker2 sudo apt-get install -y nvidia-docker2修复了相同的错误。

我想也许我可以尝试将 nvidia-docker2 安装到 DinD 19.03 (docker:19.03-dind),但不知道该怎么做?通过多阶段 docker 构建?

非常感谢!


更新:

吊舱规格:

spec:
    containers:
      - name: dind-daemon
        image: docker:19.03-dind
Run Code Online (Sandbox Code Playgroud)

Elo*_*zos 6

我自己搞定了。

参考

首先,我修改了 ubuntu-dind 镜像(https://github.com/billyteves/ubuntu-dind)来安装 nvidia-docker(即将 nvidia-docker 站点中的说明添加到 Dockerfile 中)并将其更改为基于在 nvidia/cuda 上:9.2-runtime-ubuntu16.04。

然后我创建了一个包含两个容器的 pod,一个是前端 ubuntu 容器,另一个是作为 sidecar 的特权 docker 守护进程容器。sidecar的图像是我上面提到的修改后的图像。

但由于这篇文章是 3 年前的文章,我确实花了相当多的时间来匹配依赖项版本、3 年多的仓库迁移等。

我修改后的 Dockerfile 版本来构建它

ARG CUDA_IMAGE=nvidia/cuda:11.0.3-runtime-ubuntu20.04
FROM ${CUDA_IMAGE}

ARG DOCKER_CE_VERSION=5:18.09.1~3-0~ubuntu-xenial


RUN apt-get update -q && \
    apt-get install -yq \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable"  && \
    apt-get update -q && apt-get install -yq docker-ce docker-ce-cli containerd.io

# https://github.com/docker/docker/blob/master/project/PACKAGERS.md#runtime-dependencies
RUN set -eux; \
    apt-get update -q && \
    apt-get install -yq \
        btrfs-progs \
        e2fsprogs \
        iptables \
        xfsprogs \
        xz-utils \
# pigz: https://github.com/moby/moby/pull/35697 (faster gzip implementation)
        pigz \
#        zfs \
        wget


# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
RUN set -x \
    && addgroup --system dockremap \
    && adduser --system -ingroup dockremap dockremap \
    && echo 'dockremap:165536:65536' >> /etc/subuid \
    && echo 'dockremap:165536:65536' >> /etc/subgid

# https://github.com/docker/docker/tree/master/hack/dind
ENV DIND_COMMIT 37498f009d8bf25fbb6199e8ccd34bed84f2874b

RUN set -eux; \
    wget -O /usr/local/bin/dind "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind"; \
    chmod +x /usr/local/bin/dind


##### Install nvidia docker #####
# Add the package repositories
RUN curl -fsSL https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add --no-tty -

RUN distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && \
    echo $distribution &&  \
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
      tee /etc/apt/sources.list.d/nvidia-docker.list

RUN apt-get update -qq --fix-missing

RUN apt-get install -yq nvidia-docker2

RUN sed -i '2i \ \ \ \ "default-runtime": "nvidia",' /etc/docker/daemon.json

RUN mkdir -p /usr/local/bin/
COPY dockerd-entrypoint.sh /usr/local/bin/
RUN chmod 777 /usr/local/bin/dockerd-entrypoint.sh
RUN ln -s /usr/local/bin/dockerd-entrypoint.sh /

VOLUME /var/lib/docker
EXPOSE 2375

ENTRYPOINT ["dockerd-entrypoint.sh"]
#ENTRYPOINT ["/bin/sh", "/shared/dockerd-entrypoint.sh"]
CMD []

Run Code Online (Sandbox Code Playgroud)

当我使用exec登录Docker-in-Docker容器时,我可以成功运行nvidia-smi(之前返回未找到错误,然后无法运行任何与GPU资源相关的docker run)

欢迎拉取我的图片brandsight/dind:nvidia-docker