一、问题背景与报错

1.1 背景

想为基于python的算法打包镜像,该算法需要使用GPU。

使用的基础镜像:docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04

附带pull基础镜像命令与链接:

命令:docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04

链接:docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04 - 镜像下载 | docker.io

python版本:python 3.8

1.2 报错

docker run -d --gpus all  <镜像id> 时报错

docker: Error response from daemon: failed to create shim task: OCI runtime create failed:
nvidia-container-cli: ldcache error: open failed: /sbin/ldconfig.real: no such file or directory: unknown.

docker run -d  <镜像id> 去除指定gpu可正常运行容器

并且

1) 把nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04基础镜像更换为nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04不行;

2)在dockerfile中 ln -s /sbin/ldconfig /sbin/ldcondig.real;(gpt教的)不行

二、问题原因以及解决方法

2.1 问题原因

不是镜像问题,而是宿主机 Docker 引擎没有配置 nvidia runtime

cat /etc/docker/daemon.json

如果 /etc/docker/daemon.json 里没有如下字段,GPU容器就run不起来

"runtimes": {
  "nvidia": {
    "path": "nvidia-container-runtime",
    "runtimeArgs": []
  }
},
"default-runtime": "nvidia"
2.2 解决方法

将该字段加入/etc/docker/daemon.json

重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

三、本次 Docker 镜像构建基础流程

3.1 生成requirement.txt依赖文件

anaconda 配置环境

生成依赖文件

pip freeze > requirements.txt
3.2 编写Dockerfile
# 1. 使用 CUDA devel 镜像(带完整工具链,支持 GPU)
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04

# 2. 设置非交互模式
ENV DEBIAN_FRONTEND=noninteractive

# 3. 安装 Python3.8 和常用依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        python3.8 \
        python3.8-dev \
        python3.8-venv \
        curl \
        build-essential \
        libgl1-mesa-glx \
        libglib2.0-0 \
        libsm6 \
        libxext6 \
        libxrender-dev \
        libgomp1 \
        libtbb2 \
        libjpeg-dev \
        libpng-dev \
        libtiff-dev \
        libavformat-dev \
        libpq-dev && \
    rm -rf /var/lib/apt/lists/*

# 4. 安装 pip/setuptools/wheel
RUN curl -sS https://bootstrap.pypa.io/pip/3.8/get-pip.py | python3.8 && \
    python3.8 -m pip install --no-cache-dir --upgrade pip setuptools wheel

# 5. 设置 Python3.8 为默认
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 && \
    update-alternatives --set python3 /usr/bin/python3.8 && \
    ln -sf /usr/bin/python3.8 /usr/bin/python && \
    ln -sf /usr/local/bin/pip /usr/bin/pip

# 6. 设置工作目录
WORKDIR /app

# 7. 复制 requirements.txt 并安装 Python 依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# 8. 复制项目代码
COPY . ./

# 9. 暴露端口
EXPOSE xxxx

# 10. 启动服务
CMD ["python", "run.py"]
3.3 构建镜像
docker build -t name:version .
# 示例
docker build -t sort:v1 .
3.4 运行容器以及相关命令
# 运行镜像
docker run -d --gpus all -p xxxx:xxxx <镜像id>

# 查看所有镜像
docker images

# 查看所有容器
docker ps -a

#停止容器
docker stop <容器id>

#删除容器
docker rm <容器id>

#删除镜像
docker rmi <镜像id>

其他问问gpt

四、下载官方 nvidia/cuda

通过github下载

具体见大佬博客国内无法拉取Docker镜像了?这些方法拯救你的Docker-腾讯云开发者社区-腾讯云

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐