You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python Docker容器中安装的包在启停后持久化?

解决Docker容器中Python包重启后丢失的问题

你当前的操作是直接在运行的容器内安装依赖,但Docker容器的文件系统属于临时层——所有运行时的修改仅存在于当前容器实例中,一旦容器被删除、或用原始镜像重新创建新容器,这些修改就会丢失。要让安装的包持久化,有三种常用解决方案:

方案一:挂载卷到Python的site-packages目录

把Python存放第三方包的目录挂载到宿主机磁盘,这样安装的包会直接保存在宿主机,容器重启或重新创建都不会丢失。

  1. 先找到容器内Python的site-packages路径:
docker exec container-name python -c "import site; print(site.getsitepackages()[0])"

执行后会得到类似/usr/local/lib/python3.10/site-packages的路径。

  1. 停止当前运行的容器:
docker stop container-name
  1. 重新启动容器时挂载宿主机目录到上述路径:
docker run -v /宿主机本地路径/python-site-packages:/usr/local/lib/python3.10/site-packages [其他启动参数] 你的镜像名

如果用Docker Compose,在docker-compose.yml的volumes部分添加:

volumes:
  - ./python-site-packages:/usr/local/lib/python3.10/site-packages
  1. 之后再通过docker exec进入容器安装包,包会被保存到宿主机的挂载目录中,无论容器重启还是重新创建,依赖都会保留。

方案二:提交修改后的容器为新镜像

将安装完包的容器提交为一个新镜像,后续用这个新镜像启动容器,依赖会被永久保存在镜像里。

  1. 在容器内安装完包后,退出exec会话,执行提交命令:
docker commit container-name new-python-image:v1

这里new-python-image是新镜像的名称,v1是版本标签,可自行修改。

  1. 之后用新镜像启动容器:
docker run [启动参数] new-python-image:v1

新容器会包含你之前安装的所有包,重启或重新创建都不会丢失。

方案三:维护requirements.txt并重新构建镜像

这是Docker环境下管理Python依赖最规范的做法,把所有依赖包列在requirements.txt中,通过Dockerfile构建镜像,确保依赖可重复、可版本控制。

  1. 在项目根目录创建requirements.txt,写入需要的包:
requests==2.31.0
numpy==1.26.0
# 新增的包直接追加到这里
  1. 修改你的Dockerfile,添加依赖安装步骤:
FROM python:3.10
WORKDIR /app
# 先复制requirements.txt,利用Docker缓存优化构建速度
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 启动应用
CMD ["python", "your-app.py"]
  1. 重新构建镜像:
docker build -t your-python-app:latest .
  1. 用新构建的镜像启动容器,所有依赖都已包含在镜像中,容器重启或重新创建都不会丢失依赖。

各方案对比

  • 卷挂载:适合临时快速添加依赖,无需重新构建镜像,但依赖文件分散在宿主机,不利于版本控制和迁移。
  • 提交镜像:适合临时测试场景,但每次提交会增加镜像层数,导致镜像体积膨胀,长期维护不友好。
  • requirements.txt+构建镜像:最适合生产环境,依赖清晰可追溯,镜像干净可重复构建,便于团队协作和版本管理。

内容的提问来源于stack exchange,提问作者Minura Punchihewa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:47:29