Docker 全离线部署 Python 应用完整指南
本文详细介绍如何在完全离线的环境中部署 Python应用,涵盖从有网环境准备依赖到离线服务器部署的全流程。
目录
- 离线部署完整方案
- 第一步:有网机器准备依赖
- [1. 拉取基础镜像并保存](#1. 拉取基础镜像并保存)
- [2. 准备 Python 依赖包](#2. 准备 Python 依赖包)
- [3. 修改 Dockerfile(离线安装)](#3. 修改 Dockerfile(离线安装))
- 第二步:打包传输到离线服务器
- 第三步:离线服务器部署
- 第一步:有网机器准备依赖
- 文件结构总结
- 验证离线安装成功
离线部署完整方案
第一步:有网机器准备依赖
1. 拉取基础镜像并保存
bash
# 拉取 Python 3.8 镜像
docker pull python:3.8-slim
# 保存为 tar 文件
docker save -o python3.8-slim.tar python:3.8-slim
2. 准备 Python 依赖包
bash
# 创建临时目录下载依赖
mkdir /tmp/offline-packages
cd /tmp/offline-packages
# 创建 requirements.txt(与项目一致)
cat > requirements.txt << 'EOF'
streamlit==1.12.0
pandas==1.3.5
numpy==1.21.6
EOF
# 下载所有依赖包(包括子依赖)
pip download -r requirements.txt -d ./packages
如果本机没有 Python 3.8,可以用 Docker 临时容器下载:
bashdocker run --rm -v $(pwd):/out python:3.8-slim bash -c "pip download -r /out/requirements.txt -d /out/packages"
3. 修改 Dockerfile(离线安装)
dockerfile
FROM python:3.8-slim
WORKDIR /app
# 复制本地依赖包和 requirements
COPY packages/ ./packages/
COPY requirements.txt .
# 离线安装(不连网)
RUN pip install --no-index --find-links=./packages -r requirements.txt
# 复制项目代码
COPY . .
EXPOSE 8501
CMD ["streamlit", "run", "app.py", "--server.address=0.0.0.0", "--server.port=8501"]
第二步:打包传输到离线服务器
bash
# 在有网机器上,把以下文件打包
tar czvf deploy-package.tar.gz \
python3.8-slim.tar \
packages/ \
Dockerfile \
requirements.txt \
app.py \
[其他项目文件...]
通过 U 盘/内网/其他方式传到服务器。
第三步:离线服务器部署
bash
# 1. 解压
tar xzvf deploy-package.tar.gz
cd deploy-package/
# 2. 加载基础镜像
docker load -i python3.8-slim.tar
# 3. 构建(完全离线)
docker build -t my-streamlit-app .
# 4. 运行
docker run -d -p 8501:8501 --name streamlit-app my-streamlit-app
文件结构总结
deploy-package/
├── python3.8-slim.tar # 基础镜像
├── packages/ # 所有 Python 依赖 whl 文件
│ ├── streamlit-1.12.0-py2.py3-none-any.whl
│ ├── pandas-1.3.5-xxx.whl
│ └── ...
├── Dockerfile # 离线安装版本
├── requirements.txt # 依赖清单
├── app.py # 主程序
└── [其他项目文件]
验证离线安装成功
bash
# 进入容器检查
docker exec -it streamlit-app bash
# 查看已安装包
pip list | grep streamlit # 应显示 1.12.0
# 确认没有连网
pip install requests # 应报错(找不到包)