docker保存自己的conda环境(解决pip与conda混合安装问题)
·
小编原本打算使用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
更多推荐


所有评论(0)