Docker关于conda环境的导出和导入
1、常用命令:
python
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、环境导出:
python
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、两个服务器之间的文件传输命令:
python
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、环境导入:
python
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、快速进入容器
python
正常进入容器需要先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,显示没有驱动
python
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
python
apt-get update
apt-get install -y vim
3)容器进入失败
python
解决方法:
docker start testtorch
docker exec -u 0 -it testtorch /bin/bash
4)su进入失败
python
$ 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包失败
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失败
python
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)
python
方法一:在Dataloader中将num_worker设置为0。意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。
方法二:在起Docker容器时,设置 --ipc=host 或 --shm-size 或者