记录一次将
python
项目制作成docker
镜像的过程,我打算将一个flask
的python
项目打包成镜像,因此我选择使用miniconda
的docker
镜像作为基础镜像,然后启动该docker
镜像,并在里面创建好虚拟环境并安装好依赖,然后将项目文件传到容器内,最后再将这个容器制作成镜像,以后就可以基于该镜像直接启动服务,需要注意的是,docker
虽然是跨平台,但是还是会和机器指令集有关,我们在x86
机器上制作的镜像,没法在arm
架构机器上使用。
1 拉取基础镜像
docker pull continuumio/miniconda
3 运行基础镜像并安装依赖
docker run -it continuumio/miniconda /bin/bash# 创建一个名为 myenv 的虚拟环境conda create -n myenv python=3.10source activate myenv# 开始安装各种依赖conda install -c conda-forge gdal=3.4.3......
4 拷贝项目文件至容器
docker cp ./0424 c35c1da55055:/app
5 打包镜像
docker commit c35c1da55055 railway_routeplan:latest# 若要转移到别的机器上可以看这个教程https://www.tankenqi.cn/posts/19
7 基于镜像启动服务
这里我是将容器内的
5009
端口的flask api
服务映射到宿主机的15009
,以便在集群内访问
docker run -d -p 15009:5009 --name railway_routeplan railway_routeplan:latest bash -c "source activate myenv && cd /app/0424/ && python /app/0424/app.py"
8 查看服务
docker ps
9 调用服务
curl -X POST http://127.0.0.1:15009/routePlan \ -H "Content-Type: application/json" \ -d '{"startStation": "宝日希勒露天煤矿", "endStation": "白城厂"}'
如果需要执行容器内
python
项目的其他脚本文件,则可以按下面方式执行,这两个是本项目的数据预处理程序。
docker exec -it railway_routeplan /bin/bash -c "source activate myenv && cd /app/0424/ && python /app/0424/points_updata.py"
docker exec -it railway_routeplan /bin/bash -c "source activate myenv && cd /app/0424/ && python /app/0424/linestation_json_distanse_json.py"
10 补充
当然,上面这种方式是把项目文件直接打包进镜像,如果代码经常需要修改,则可以在启动服务的时候动态挂载,如下所示:
# /app/0424 不需要提前创建,也可以不和外部文件夹名保持一致docker run -d \ -p 15009:5009 \ -v /root/0424:/app/0424 \ --name railway_container \ railway_routeplan:latest \ bash -c "source activate myenv && cd /app/0424 && python app.py"