方式一、python程序整体打包为docker镜像
直接将开发环境的python程序打包为容器镜像,上传到服务器上运行
使用pycharm编写程序
写py脚本,在pycharm里面可以运行
创建requirements.txt文件
在当前目录下,或者是项目根目录下面,创建requirements.txt文件
添加依赖包到requirements.txt文件
使用pycharm功能,Tool > sync Python requirements
Package Requirements file 选择刚创建requirements.txt的文件,点Ok即可创建
打开requirements.txt,检查有无问题
也可以自己根据编写的py脚本中的import的包,手动添加和修改requirements.txt文件
编写Dockerfile文件
Dockerfile位于要打包的py脚本同一级
# 使用官方 Python 镜像作为基础镜像
FROM python:3.10.0-slim-bullseye
# 设置工作目录
WORKDIR /program
# 将本地代码复制到镜像中
COPY . /program
# 安装依赖
RUN pip install -r requirements.txt
# 暴露端口(如果需要)
EXPOSE 83
# 执行应用程序
CMD ["python", "查询天气.py"]
开发环境(windows)安装Docker Desktop
本地安装Docker环境
打包
docker build -t my_python .
查看打包镜像
docker images
导出镜像
docker save -o my_python.tar my_python
镜像拷贝到服务器上
将my_python.tar上传至服务器上
运行镜像
加载镜像
docker load -i my_python.tar
运行镜像
docker run -p 83:83 my_python
测试
验证效果
如果有问题可以进入容器检查
方式2 单独的python脚本+python标准容器
在服务器上使用标准python镜像,创建容器,挂载我们开发的python脚本运行 使用docker部署python程序,好处是不用修改原有系统。
准备Docker基础环境
确保系统上安装了docker、docker-compose
当前测试的版本如下,其它版本估计也没问题
Docker Version 20.10.3
Docker Compose version v2.10.1
准备python基础环境
在线方式
拉取镜像
docker pull python:3.10.0
离线方式,下载已有的镜像
如果服务器没有外网,直接下载离线镜像(阿里云盘 /备份盘/安装包/语言/Python)
docker load -i python-3.10.0-docker-image-linux-x86_64.tar
离线方式,自己下载镜像,自己保存镜像
或者找个通外网的服务器,下载好了之后,使用docker save 下来
准备python程序环境
目录结构
/data/weather
----docker-compose.yml
----program
--------start.sh
--------stop.sh
--------get.py
--------common.py
--------...其他自己编写的文件
--------site-packages
工作目录
到当前工作目录
cd /data/weather
创建program目录
mkdir -p program/site-packages
拷贝py脚本
拷贝你的python程序(即py文件)到program目录中
如我的是 get.py
创建start.sh文件
在 program目录中创建start.sh
#!/bin/bash
cd /program
# 设置第三方包的路径
export PYTHONPATH="$PWD/site-packages"
python get.py
创建stop.sh文件
在 program目录中创建stop.sh
#!/bin/bash
pid=`ps -ef | grep python | awk '{print $2}'`
kill -9 $pid
return 0
拷贝第三方依赖包
从开发环境,把第三方依赖包拷贝到program/site-packages目录下
如requests、urllib3、chardet、charset_normalizer、idna
通过在开发环境cmd执行
pip config list
可以查看到包的位置,
如global.target='D:\\ProgramData\\Python\\Python310\\site-packages'
一般情况下,开发的电脑上的第三方包,拷贝到服务器上就可以直接使用了。
一些特殊的包
有些特殊的包,如pandas、numpy等,内置了操作系统相关的dll或者so文件,因此无法从开发环境直接拷贝包到linux环境上去。
这类问题大多数报的错是找不到包。
可以在一台可以联网的linux上安装好了python容器,然后使用pip install numpy 这样的方式安装好了之后,再将这些包拷贝到目标linux服务器上。
创建docker-compose.yml文件
在工作目录/data/weather下面,添加docker-compose.yml
version: '3'
services:
python_service:
image: python:3.10.0
container_name: "python_service"
network_mode: bridge
restart: always
ports:
- 83:83
environment:
- "LANG=en_US.UTF-8"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/hosts:/etc/hosts:ro
- ./program:/program/
entrypoint: ["/bin/bash", "-c" , "echo \"python service create succuss!!\" && sh /program/stop.sh && sh /program/start.sh "]
启动
在工作目录/data/weather下面,启动
docker-compose up
测试
测试是否达到预期
排查问题
打开另1个shell窗口,进入容器内部,进行排查
进入容器
docker exec -it python_service bash
检查进程ps -ef | grep python
cd /program
结束进程
sh stop.sh
启动进程
sh start.sh
更新py脚本
更新program下面的get.py即可
方式三、非docker 直接执行py脚本
准备python环境
- 安装python
在系统上安装python,编译-安装...等过程
这个方式会影响源系统
- 复用现有的python安装包
将 python.3.10.1_centosx86-7.5.tar.gz(在其他系统上制作好) 上传到服务器上 /data/weather
这个方式会有小问题,因为python没有经过编译,例如ssl模块没有链接系统库文件,导致python的ssl模块不可用
准备py文件
将开发环境的py文件拷贝到 program目录中
准备第三方库
将用到的第三方库,拷贝到programs中
从开发环境,把第三方依赖包拷贝到program目录中
如requests、urllib3
通过在开发环境cmd执行
pip config list
可以查看到包的位置,
如global.target='D:\\ProgramData\\Python\\Python310\\site-packages'
运行
/data/weather/python3/bin/python3 /data/weather/program/get.py
测试
检查效果
方式四、使用python虚拟环境
如 conda等虚拟环境,略... 后续补充