小编原本打算使用conda pack来打包部署好的conda虚拟环境,结果发现在配置环境时出现了conda与pip混搭安装库和依赖,导致无法使用conda pack打包虚拟环境,我参考了其他方法以及询问了ai,得到了一下方法。

1.压缩虚拟环境

#hdx 换成直接的虚拟环境
tar -czvf hdx.tar.gz -C ~/anaconda3/envs hdx

2.添加docker镜像源,共享NVIDIA

sudo touch etc/docker/daemon.json
sudo nano etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "/usr/bin/nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

将上面内容复制进去

3.编写Dockerfile

touch Dockerfile
nano Dockerfile

复制一下内容到Dockerfile,(仅复制conda环境)

#若为miniconda环境则替换anaconnda即可
FROM continuumio/anaconda3

# 复制压缩的虚拟环境
COPY hdx.tar.gz /opt/conda/envs/

# 解压虚拟环境
RUN tar -xzvf /opt/conda/envs/hdx.tar.gz -C /opt/conda/envs/ && rm /opt/conda/envs/hdx.tar.gz

# 设置默认 Shell 为 Bash
SHELL ["/bin/bash", "-c"]

# 激活环境
RUN echo "conda activate hdx" >> ~/.bashrc

# 设定默认工作目录
WORKDIR /workspace

# 默认启动 Bash
CMD ["/bin/bash"]

ubuntu22.04以及cuda12.4需求可以使用下面

# 使用 Ubuntu 22.04 作为基础镜像
FROM ubuntu:22.04

# 设置非交互式前端以避免安装过程中的提示
ENV DEBIAN_FRONTEND=noninteractive

# 安装必要的系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget \
    bzip2 \
    ca-certificates \
    libglib2.0-0 \
    libxext6 \
    libsm6 \
    libxrender1 \
    git \
    build-essential \
    software-properties-common \
    && rm -rf /var/lib/apt/lists/*

# 添加 NVIDIA 包仓库
RUN wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb && \
    dpkg -i cuda-keyring_1.1-1_all.deb && \
    apt-get update

# 安装 CUDA 12.4
RUN apt-get install -y --no-install-recommends \
    cuda-toolkit-12-4 \
    cuda-libraries-12-4 \
    cuda-nvtx-12-4 \
    && rm -rf /var/lib/apt/lists/*

# 设置 CUDA 环境变量
ENV CUDA_HOME=/usr/local/cuda
ENV PATH=/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}

# 安装 Anaconda
RUN wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -O anaconda.sh && \
    bash anaconda.sh -b -p /opt/conda && \
    rm anaconda.sh

# 设置 Conda 环境变量
ENV PATH /opt/conda/bin:$PATH

# 更新 Conda
RUN conda update -n base -c defaults conda -y

# 设置工作目录
WORKDIR /workspace

# 复制环境配置文件(如果有)
#COPY environment.yml .

# 创建 Conda 环境(如果有 environment.yml)
#RUN if [ -f environment.yml ]; then conda env create -f environment.yml; fi

# 设置默认命令
CMD ["/bin/bash"]

# 复制压缩的虚拟环境
COPY hdx.tar.gz /opt/conda/envs/

# 解压虚拟环境
RUN tar -xzvf /opt/conda/envs/hdx.tar.gz -C /opt/conda/envs/ && rm /opt/conda/envs/hdx.tar.gz

# 设置默认 Shell 为 Bash
SHELL ["/bin/bash", "-c"]

# 激活环境
RUN echo "conda activate hdx" >> ~/.bashrc

# 设定默认工作目录
WORKDIR /workspace

# 默认启动 Bash
CMD ["/bin/bash"]

4.构建docker镜像

docker build -t my_conda_env .

5.启动docker容器

docker run -it --rm my_conda_env

看到(hdx)就说明环境打包成功

#使用gpu
docker run -it --gpus all my_conda_env

若没有手动激活

# 手动激活环境
source /opt/conda/bin/activate hdx

6.打包镜像

#查看镜像id
docker images

#id如下
#REPOSITORY                                                  TAG       IMAGE ID       #CREATED         SIZE
#my_conda_env                                                latest    882ad9822309   #8 minutes ago   14.5GB


#压缩镜像
docker save my_conda_env:latest | gzip > my_conda_env.tar.gz

7.在其他设备加载镜像

#导入
docker load -i my_conda_env.tar.gz
#查看
docker images

8.使用镜像

# 运行交互式容器
docker run -it my_conda_env:latest

# 如果镜像需要访问 GPU 需要安装显卡驱动
docker run -it --gpus all my_conda_env:latest

# 在后台运行容器
docker run -d --name my_container my_conda_env:latest

# 运行容器并映射端口(如果镜像中有服务)
docker run -p 8888:8888 my_conda_env:latest

9.共享本地文件

#docker run -v /主机/路径:/容器/路径 [其他选项] 镜像名

# 将主机上的 /home/fishros/project 目录挂载到容器的 /workspace 目录
docker run -it --gpus all -v /home/fishros/project:/workspace my_conda_env

# 挂载多个目录
docker run -it --gpus all \
  -v /home/fishros/project:/workspace \
  -v /home/fishros/data:/data \
  my_conda_env

# 使用相对路径(相对于当前终端所在目录)
docker run -it --gpus all -v $(pwd)/project:/workspace my_conda_env

10.删除镜像(打包后太占内存可以清除掉)


# 删除所有未使用的镜像
docker image prune -a

# 删除所有停止的容器和未使用的镜像
docker system prune -a

# 删除特定的镜像
docker rmi <image_id_or_name>

删除报错

fishros@fishros:~$ sudo docker rmi my_conda_env
Error response from daemon: conflict: unable to remove repository reference "my_conda_env" (must force) - container af0a6430aaa1 is using its referenced image 882ad9822309
#强制删除id和镜像
sudo docker rm -f 10127ba94a21
sudo docker rmi -f my_conda_env

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐