docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker conda导出导入

Docker中conda环境的导出和导入

作者:UHLJH

现在很多的应用程序系统都会选择使用docker容器进行部署,本文主要介绍了Docker中conda环境的导出和导入,具有一定的参考价值,感兴趣的可以了解一下

1、常用命令:

docker pull -- 从远程仓库将镜像下载至本地
docker run -- 运行一个容器
docker images -- 常看本地镜像
docker ps -- 查看容器,默认只查看已启动的,加入 "-a" 参数可以查看所有
docker rm -f ID # 删除之前的运行容器

重命名容器
docker rename old_name new_name
拷贝文件到容器中
docker cp MLP 95909784d85b:/workspace/
进入容器中
docker exec -u 0 -it testtorch /bin/bash

docker save保存的是镜像(image),docker export保存的是容器(container)
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

2、环境导出:

Step-1:
安装docker(可以忽略)

Step-2:
拉取anaconda镜像(docker images检查看看,已经有了的话就跳过这一步)
docker pull continuumio/anaconda3

Step-3:
基于拉取的镜像创建容器
docker run -i -t continuumio/anaconda3 /bin/bash

Step-4-1:
cd opt/conda/envs
ls(没有东西)

step-4-2(可选步骤):
退出容器: exit
查看容器名称:docker ps -a
可以改容器名称:docker rename great_chaum ljhpytorch
再次查看容器名称:docker ps -a


Step-5:
查看本地anaconda中env的路径(例如:/home/ljh/anaconda3/envs/pytorch/)

Step-6:
可以另起一个终端
把本地的环境文件复制到容器中
docker cp /home/ljh/anaconda3/envs/pytorch/ ljhpytorch:/opt/conda/envs


Step-7
启动容器:docker start ljhpytorch
进入容器:docker exec -u 0 -it ljhpytorch /bin/bash 
查看是否文件已经复制过来cd opt/conda/envs
ls

Step-8:
验证是否能够使用环境:source activate 环境名称
例如:source activate pytorch

Step-9:
运用 docker commit 指令将运行的容器保存为镜像。
docker commit container_name image_name(随便取) 
例如:docker commit ljhpytorch ljhpytorchimage
docker images可以看到新增了一个镜像

Step-10:
镜像导出:
docker save -o image.tar(这个也可以随便取名字) image_name

给文件夹或文件全部的权限:sudo chmod -R 777 ./tao/(选择修改权限的文件名称)

3、两个服务器之间的文件传输命令:

scp -r /home/myfile username@192.000.000.000:/home/myfile
其中scp为命令,-r代表移动文件,/home/myfile代表源文件夹所在的绝对路径,username@192.000.000.000:/home/myfile代表目标服务器中目标用户名的目标文件夹。
示例: 【默认目标服务器端口22】
scp -r /data/liujiahui/2022/master/ ljh@192.XXX.XXX.XXX:/DataDisk/liujiahui/AllCode/

如果需要指定目标服务器端口:
scp -r -P 5022 /data/liujiahui/2022/master/ ljh@192.XXX.XXX.XXX:/DataDisk/liujiahui/AllCode/

跳出选项,记得输入yes,然后输入密码

4、环境导入:

Step-1:
镜像导入
docker load < image.tar

Step-2:
(挂载的同时已经创建了容器,容器名称取决于下面的 --name)
挂载宿主机目录至容器/data 目录:(此处需要修改的是宿主机目录)
这样可以便于文件的传输共享
示例:
docker run -id --gpus all --name ljhcontain -v /home/ljh/Desktop/mydata/:/data/ ljhpytorchimage

Step-3:
进入容器
docker exec -u 0 -it ljhcontain /bin/bash

Step-4:
nvidia-smi
查看是否可以使用gpu
完成!

5、快速进入容器

正常进入容器需要先su进入超级用户,然后执行以下两个命令
docker start ljhcontain(有时候不需要)
docker exec -u 0 -it ljhcontain /bin/bash

由于不是很好记忆,因此可以通过将上述命令直接写在bash脚本执行,步骤如下:

Step-1:
创建一个文件名为xxxx.sh的空文件,可以直接在home/用户名/下面创建

Step-2:
在文件中写入下面两行(记得修改容器名称),然后保存
docker start ljhcontain
docker exec -u 0 -it ljhcontain /bin/bash

Step-3:
bash xxx.sh
可以直接一步进入容器(如下图所示)

注:还有其他通过修改环境变量等方法,感觉有些麻烦,可以自行研究

6、其他问题解决记录:

1)docker无法使用gpu,显示没有驱动

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt-get install -y nvidia-container-toolkit

2)bash: vim: command not found

apt-get update
apt-get install -y vim

3)容器进入失败

解决方法:
docker start testtorch
docker exec -u 0 -it testtorch /bin/bash  

4)su进入失败

$ su - root
Password: 
su: Authentication failure
Sorry.

解决办法:
$ sudo passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

5)pip安装python包失败

使用pip安装python包的时候,出现以下错误:
bash: /opt/conda/envs/pytorch/bin/pip: /home/ljh/anaconda3/envs/pytorch/bin/python: bad interpreter: No such file or directory

解决方法:
在容器中解决问题
step-1:【如下图所示】
which pip
获得pip路径

step-2:【如下图所示】
which python
获得python路径

step-3:【如下图所示】
vim pip路径
这里可能会vim报错,解决方法参考问题3

step-4:
vim常用操作指令:
按下i表示开始编辑
按下Esc表示保存并退出编辑
退出编辑之后按下:wq可以退出vim

这一步需要完成的是修改把文件第一行的路径修改为step-2获取的路径【如下图所示】

step-5:
测试是否成功
pip -V

在这里插入图片描述

6)docker中使用cv2失败

import cv2
出现以下报错:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决方法:
apt-get update
apt-get install ffmpeg libsm6 libxext6  -y

7)训练时出现共享内存不够(Bus error)

方法一:在Dataloader中将num_worker设置为0。意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。
方法二:在起Docker容器时,设置 --ipc=host 或 --shm-size 或者

到此这篇关于Docker中conda环境的导出和导入的文章就介绍到这了,更多相关Docker conda导出导入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文