记录一次将
python项目制作成docker镜像的过程,我打算将一个flask的python项目打包成镜像,因此我选择使用miniconda的docker镜像作为基础镜像,然后启动该docker镜像,并在里面创建好虚拟环境并安装好依赖,然后将项目文件传到容器内,最后再将这个容器制作成镜像,以后就可以基于该镜像直接启动服务,需要注意的是,docker虽然是跨平台,但是还是会和机器指令集有关,我们在x86机器上制作的镜像,没法在arm架构机器上使用。
1 拉取基础镜像

docker pull continuumio/miniconda3 运行基础镜像并安装依赖
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:/app5 打包镜像
docker commit c35c1da55055 railway_routeplan:latest# 若要转移到别的机器上可以看这个教程https://www.tankenqi.cn/posts/197 基于镜像启动服务
这里我是将容器内的
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"