python程序,放入docker容器中, 生成镜像

注: 本文为自己将一个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

PS:pyintaller打包 = python解释器+ 脚本+ 第三方包和自动关联和request相关联的包。
打包时 自己经过实践 发现打包完毕本地运行程序没问题;
但是发给别人使用时,报错缺少库; 追加了缺少的库后, 再次发给别人使用,先前缺少的库的报错不见了, 但是提示缺少其他的库。(自我猜测:就算其他人安装了缺失的库,也许越能运行, 程序使用的动态库和makefile里面指定的动态库位置不同)

自己反思: pyinstaller 打包并不是把环境中的所有库都打包进去了。所以菜用到了容器, 并且在容器里进行了环境的配置。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值