注: 本文为自己将一个python程序,放入docker容器中,并在docker容器中使用pyinstaller将此python程序打包成可执行文件。
确保当前宿主机上的磁盘空间足够使用。(本文Demo光一个容器就耗费了7.8G)
一、 给本机安装docker
1.安装依赖
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
2.移除旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
3.添加dockerGPG证书
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4.添加存储库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5.安装docker
//-- 更新apt包索引
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
6.查看docker版本 docker --version
root@ubuntu:/home/lxk/Desktop# docker --version
Docker version 20.10.16, build aa7e414
二、拉取基础镜像并创建容器(我选择的是Ubuntu)
1> df -lh 命令查看当前Ubuntu虚拟机下的磁盘空间
2> 搜索镜像 docker search ubuntu
ODFFICAL 指是否官方
START 好像和好评的意思吧
3> 拉取镜像 docker pull ubuntu
4> 查看镜像 docker images 会看到刚才镜像信息
5> 运行并创建容器 docker run -itd --name=anaconda_test ubuntu
6> 查看运行中的容器 docker ps
7> 进入容器 docker exec -it anaconda_test /bin/bash
三、在容器中配置 vim 和源
1> 查看容器是基于linux的哪一个发行 cat /etc/issue
在容器里lsb_release -a 这个命令是无效的,gedit和sudo这个命令是无效的(容器是一个非常精简的操作系统,所以需要自己去安装需要的工具)
2> apt-get update 更新apt (这个时间比较长)
3> apt-get remove vim-common和apt-get install vim 更新vim可以使vi可用(这个时间比较长)
4> 想要在容器里复制文本 vi打开/etc/apt/sources.list文件后, :set mouse=v 将一些源复制进去。(确保源正确,我是没有删除以前的,是追加的)
5> 再次更新 apt-get update
四、在容器中装anaconda和vsCode和从宿主机拷贝代码到容器
1> docker cp Anaconda3-2021.11-Linux-x86_64.sh anaconda_test:/root
从宿主机拷贝anaconda的安装文件(自行官网下载Linux对应版本),到容器的 root根目录下。
2> 安装anaconda ,在 /root下执行
./Anaconda3-2021.11-Linux-x86_64.sh
安装完毕,关终端,从新开终端进入容器,输入conda -V
以及conda list 以及python -V
3> 复制 fits2bmp.py 到容器的根目录下
docker cp fits2bmp.py anaconda_test:/root
4> 创建一个虚拟环境
conda create -n MyFirstEnv python=3.7
进入环境 conda activate MyFirstEnv
注意:如果想进入容器之后就进入到这个环境下,要在 vi ~/.bashrc 文件下写上 conda activate MyFirstEnv
5> 现在我要在容器中装vsCode了,别操作,先看下文
首先我安装了一个工具(因为,安装VSCode需要curl这个工具)
apt-get install curl -y
(容器是一个非常精简的操作系统,所以需要自己去安装需要的工具)
命令行装VSCode
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install code
注意: 我没装上去!!!谁会装的话,麻烦指教下。我还尝试过装spyder, 然而spyder打不开,也应该是没装成功。我放弃了!
最后如 ↑ 所示我用命令行在宿主机上安装了vscode。
6> 配置vsCode能够连接到容器
在vsCode中 安装了docker 和 远程连接的Remote-SSH 和 Remote-Container; 安装方法自行百度。
安装完毕后即看到 容器以及容器下的各文件。
打开容器下root文件夹下的 文件fits2bmp.py运行
python fit2bmp.py
逐个安装缺失的库,直到运行通过,保证程序正确执行后,准备使用pyinstaller 打包python文件。
7 > conda install pyinstaller 安装打包工具
pyinstaller -F -w fits2bmp.py 执行打包命令,生成可执行文件
注意: 有可能源码运行ok,但是打包打不出来,或者打包打出来运行可执行文件错误,根据自己的程序的复杂程度 自行判断哪里出现了错误。
基本就是库不全,或者库不匹配的问题。
pip check 命令可以帮助查找 缺失的库,或者库的不匹配。但使用pip check 并不能够让我们一定把错误解决。
运行可执行程序,确保生成的可执行文件ok。
五、 运行成功后尝试将容器打包成镜像
1 > 运行成功后尝试将容器打包成镜像
docker commit -a “作者” -m “msg” 被修改的容器名 新镜像的名字
即:
docker commit -a “dashuaige” -m “hahaha” anaconda_test image_anaconda
2 > 生成新镜像后,可将新镜像打包成tar包
docker save -o image_anaconda.tar image_anaconda
打包完毕后可以使用命令查看docker使用了多少空间
docker system df
六、 使用这个tar包
1> 我是为了保证 运行环境的清洁, 重新创建了一个虚拟机。(做不做自便)
设置密码 sudo password root
apt-get update
apt-get upgrade
装vim
配置源 /etc/apt/sources.list
装vm tools
配置共享文件路径
装docker
2> docker load -i image_anaconda 读取tar包
3 > docker images 查看镜像
4> 由这个镜像产生容器,并且挂载文件,并且可执行容器命令,并且执行脚本命令
注意:挂载的容器目录不能有文件,否则容器内原有文件会被删除!
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o nonempty
//-- 加载镜像
docker load -i image_anaconda.tar
创建容器,并执行python脚本可执行程序:
//-- 可以运行时执行
root@lxk-virtual-machine:/home/lxk# docker run -itd --name=ttt -v /home/lxk/Code:/home image_anaconda /bin/bash -c "cd /root/dist/ && ./fits2bmp /home/COI1/file-list.txt /home/COI2/"
//-- 还可以分段执行
root@lxk-virtual-machine:/home/lxk# docker run -itd --name=ttt -v /home/lxk/Code:/home image_anaconda
root@lxk-virtual-machine:/home/lxk# docker exec -it ttt /bin/bash -c "cd /root/dist/ && ./fits2bmp /home/COI1/file-list.txt /home/COI2/"
/home/lxk/Code 是宿主机包含COI的文件夹目录
/root 是容器内的挂载路径
/home/COI1/file-list.txt 参数1
/home/COI2/ 参数2