TANKENQI.cn

April 25, 2025

将 python 项目制作成 docker 镜像

Docker1.6 min to read

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

1 拉取基础镜像

image-20250426000627350

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

image-20250425221101705

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"