无网络内网环境打包 python程序为docker镜像

一、Docker 离线安装包(CentOS 7 x86_64)

1. 官方下载目录(可直接浏览器访问)

Docker 官方 CentOS 7 稳定版包地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/

2. 推荐版本(稳定兼容 CentOS 7)

直接复制链接到浏览器下载:

说明:下载这 3 个核心包,就能在内网 CentOS7 上离线安装 Docker。

二、内网 CentOS 7 离线安装步骤(直接复制执行)

把这些文件传到内网服务器的任意目录,比如 /home/app/docker-offline,然后执行以下命令:

bash

运行

复制代码
# 1. 进入安装包目录
cd /home/app/docker-offline

# 2. 安装所有 rpm 包(按顺序或批量安装)
sudo rpm -Uvh *.rpm --force --nodeps

# 3. 启动 Docker 服务
sudo systemctl start docker

# 4. 设置开机自启
sudo systemctl enable docker

# 5. 验证安装是否成功
docker --version

如果看到类似 Docker version 24.0.7, build ... 的输出,就说明安装成功了。

操作方案(离线安装 Docker 两种方式)

方式 1:rpm 本地安装(推荐)

bash

运行

复制代码
# 进入dabao目录
cd /app/algo/dabao
# 本地批量安装所有docker rpm包
yum localinstall -y *.rpm
# 启动docker并设置开机自启
systemctl start docker
systemctl enable docker
# 验证
docker -v
方式 2:解压 docker.tar 离线部署(无 yum 权限时使用)

bash

运行

复制代码
tar -zxvf docker.tar.gz
# 解压后按内部readme脚本执行二进制部署

配套 Python 环境部署流程

  1. 解压 Miniconda 压缩包,离线安装 conda
  2. 进入linux-pip目录,使用pip install --no-index --find-links=. *.whl离线安装所有 python 依赖
  3. 解压algo_service.tar.gz启动算法业务服务

三、启动 Docker 并设置开机自启

bash

运行

复制代码
# 启动服务
systemctl start docker
# 开机自动启动
systemctl enable docker
# 查看运行状态
systemctl status docker

最优方案:rpm 离线安装(不用 yum,用原生 rpm 命令)

步骤 1:按依赖顺序逐个安装 rpm 包

bash

运行

复制代码
# 1. 先装容器运行时containerd
rpm -ivh containerd.io-1.6.33-3.1.el7.x86_64.rpm

# 2. 安装docker客户端
rpm -ivh docker-ce-cli-24.0.7-1.el7.x86_64.rpm

# 3. 安装docker主程序
rpm -ivh docker-ce-24.0.7-1.el7.x86_64.rpm

# 4. 构建插件
rpm -ivh docker-buildx-plugin-0.11.2-1.el7.x86_64.rpm

# 5. compose插件
rpm -ivh docker-compose-plugin-2.20.2-1.el7.x86_64.rpm

⚠️ 如果提示权限不足: 找管理员获取 root 密码,执行 su - 输入密码切换 root 后再执行上面 rpm 命令。

步骤 2:启动 Docker 服务

安装完成后执行:

bash

运行

复制代码
systemctl start docker
systemctl enable docker
# 查看运行状态
systemctl status docker

步骤 3:验证安装

bash

运行

复制代码
docker -v
docker compose version

方案 1:获取 root 权限,离线补齐依赖(推荐,稳定标准安装)

1. 先拿到正确 root 密码,切换管理员

联系运维拿到 root 密码执行:

bash

运行

复制代码
su -

2. 离线批量安装所有 rpm(自动处理依赖顺序)

bash

运行

复制代码
/usr/bin/rpm -ivh *.rpm --nodeps

--nodeps 参数强制忽略依赖校验,绕过 container-selinux 缺失报错,一次性安装全部 5 个 docker 相关 rpm。

3. 启动 docker 服务

bash

运行

复制代码
systemctl start docker
systemctl enable docker
docker -v

方案 2:二进制免 rpm 安装(完全不需要 root 密码 / 无依赖限制,兜底方案)

利用目录里 docker.tar 二进制压缩包,仅需普通用户权限部署:

  1. 解压二进制包

bash

运行

复制代码
tar -xvf docker.tar
  1. 将 docker 二进制程序放到用户可执行目录

bash

运行

复制代码
mkdir -p ~/.local/bin
cp docker/* ~/.local/bin/
chmod +x ~/.local/bin/docker dockerd
  1. 临时添加环境变量(当前终端生效)

bash

运行

复制代码
export PATH=$HOME/.local/bin:$PATH
  1. 后台启动 dockerd(普通用户容器,不占用系统服务)

bash

运行

复制代码
dockerd --data-root ~/docker-data &
# 验证
docker -v

三、关键补充说明

  • --nodeps 参数风险:强制忽略依赖后,部分 selinux 容器权限功能会缺失,仅内网业务使用无影响;
  • 二进制方案局限性:不会注册系统 systemd 服务,重启服务器后需要重新执行 dockerd & 启动;
  • 根源问题:这台服务器离线环境缺少 container-selinux 依赖 rpm,且你无 root 权限,标准 rpm 安装流程被阻断

文档命令:sudo rpm -Uvh *.rpm --force --nodeps

  • 如果你知道 sudo 密码,执行:

bash

运行

复制代码
sudo rpm -Uvh *.rpm --force --nodeps
  • 若 sudo 无权限、只能切 root,先输密码登录 root:

bash

运行

复制代码
su -
rpm -Uvh *.rpm --force --nodeps

参数说明: --nodeps:跳过依赖检测,规避 container-selinux 缺失报错; --force:强制覆盖安装文件,避免文件冲突。

一、方案 1:基于 Miniconda 官方镜像(推荐,干净标准)

1. 在线可拉取的基础镜像(有外网时)

dockerfile

复制代码
# 基于miniconda3 python3.12
FROM continuumio/miniconda3:24.5.0
# 创建业务环境
RUN conda create -n rail_algo python=3.12 -y
# 激活环境、安装依赖
SHELL ["conda","run","-n","rail_algo","/bin/bash","-c"]
RUN pip install *.whl --no-index --find-links=/packages

离线使用方式:先在外网导出镜像包 docker save -o miniconda3.tar continuumio/miniconda3:24.5.0,传到内网用 docker load -i miniconda3.tar 导入。

二、方案 2:基于 CentOS7 系统镜像,离线安装 Miniconda(适配你当前服务器系统)

和你本地现有的 Miniconda3-py312_24.5.0-Linux-x86_64.sh 安装包完美配套,纯离线构建,不需要外网镜像:

dockerfile

复制代码
# 底层和宿主机统一 CentOS7
FROM centos:7
# 拷贝你dabao上层的miniconda安装脚本进容器
COPY Miniconda3-py312_24.5.0-Linux-x86_64.sh /tmp/
# 静默安装miniconda
RUN bash /tmp/Miniconda3-py312_24.5.0-Linux-x86_64.sh -b -p /opt/miniconda3
# 写入环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 创建算法专属conda环境
RUN conda create -n algo python=3.12 -y
# 离线安装whl依赖包
COPY linux_packages /packages
SHELL ["conda","run","-n","algo","/bin/bash","-c"]
RUN pip install --no-index --find-links=/packages *.whl
# 启动你的铁路算法服务
WORKDIR /app
COPY rail_algo_service-code /app
CMD ["conda","run","-n","algo","python","main.py"]

离线打包流程(你内网场景)

  1. 外网导出 centos:7 基础镜像 docker save -o centos7.tar centos:7
  2. centos7.tar、miniconda 安装脚本、所有 whl 离线包、项目代码一起传到内网服务器
  3. 内网先导入系统镜像:docker load -i centos7.tar,再执行 docker build 构建带 conda 的算法镜像

二、导入 Miniconda 镜像包操作(你当前目录文件)

重登录权限生效后执行导入:

bash

运行

复制代码
# 回到algo目录
cd /app/algo
# 离线加载conda基础镜像
docker load -i Miniconda3-py312_24.5.0-Linux-x86_64.tar.gz

本地已有 Python/conda 环境 + 业务程序打包 Docker 完整步骤

前置说明

你现在机器是 Linux,本地有完整 Miniconda3-py312 环境、rail_algo_service 业务代码,分两种打包方案:

  1. 方案 A(推荐离线可用):导出 conda 环境清单 + 代码构建镜像(镜像体积小)
  2. 方案 B(完全复刻本地环境):导出完整 conda 环境目录打包进镜像(和本机环境 1:1)

方案 A:基于环境清单构建(通用、体积小)

步骤 1:导出本地 conda 环境配置

进入你的 conda 环境,导出依赖清单

bash

运行

复制代码
# 激活你正在使用的conda环境
conda activate base
# 导出环境yml(记录所有包版本)
conda env export > algo_env.yml
# 复制yml到代码目录
cp algo_env.yml /home/app/algo/rail_algo_service0603/

步骤 2:进入代码目录,编写 Dockerfile

bash

运行

复制代码
cd /home/app/algo/rail_algo_service0603
vim Dockerfile

Dockerfile 内容:

dockerfile

复制代码
# 基础镜像选用CentOS7(适配你现有服务器环境)
FROM centos:7
# 1. 复制Miniconda离线安装包到容器内
COPY ../Miniconda3-py312_24.5.0-0-Linux-x86_64.sh /tmp/
# 静默安装miniconda到/opt/miniconda3
RUN bash /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh -b -p /opt/miniconda3 && \
    rm -f /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh
# 将conda加入环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 2. 复制环境依赖文件
COPY algo_env.yml /tmp/
# 根据yml创建conda环境
RUN conda env create -f /tmp/algo_env.yml
# 自动激活conda环境
ENV CONDA_DEFAULT_ENV=base
# 3. 复制业务代码到容器工作目录
WORKDIR /app
COPY . .
# 暴露端口(根据你的服务实际端口修改,示例8080)
EXPOSE 8080
# 容器启动命令,替换为你的服务启动脚本
CMD ["bash", "start.sh"]

步骤 3:构建镜像

bash

运行

复制代码
# 末尾的 . 代表Dockerfile所在当前目录
docker build -t rail_algo_service:0603 .

步骤 4:本地测试镜像

bash

运行

复制代码
# 前台启动测试
docker run --rm -p 8080:8080 rail_algo_service:0603
# 后台常驻启动
docker run -d --name rail_algo -p 8080:8080 rail_algo_service:0603

步骤 5:导出镜像(离线部署到其他机器)

bash

运行

复制代码
docker save -o rail_algo_service_0603.tar rail_algo_service:0603
# 其他机器导入使用
docker load -i rail_algo_service_0603.tar

方案 B:完整复制本机 conda 环境(1:1 复刻本地环境,无重新安装依赖)

适合内网完全离线、无法在线安装包的场景

步骤 1:打包本地完整 conda 环境目录

bash

运行

复制代码
# 打包本机miniconda目录
tar -zcvf miniconda3.tar.gz /home/app/miniconda3
# 复制压缩包到代码目录
cp miniconda3.tar.gz /home/app/algo/rail_algo_service0603/

步骤 2:Dockerfile(直接解压本地 conda 包)

dockerfile

复制代码
FROM centos:7
# 复制conda完整压缩包
COPY miniconda3.tar.gz /opt/
# 解压到容器内/opt/miniconda3
RUN tar -zxf /opt/miniconda3.tar.gz -C /opt/ && rm -f /opt/miniconda3.tar.gz
# 配置环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 复制业务代码
WORKDIR /app
COPY . .
EXPOSE 8080
CMD ["bash", "start.sh"]

步骤 3-5:构建、测试、导出镜像

和方案 A 完全一致,命令通用:

bash

运行

复制代码
# 构建
docker build -t rail_algo_full_env:0603 .
# 测试运行
docker run --rm rail_algo_full_env:0603
# 导出离线镜像包
docker save -o rail_algo_full.tar rail_algo_full_env:0603

关键补充适配你当前环境的注意事项

1. 离线 whl 包补充(如果有 pip 离线依赖)

若你有 linux_pip 目录下的 whl 包,在 Dockerfile 中增加复制安装逻辑:

dockerfile

复制代码
# 复制whl包目录
COPY ../linux_pip /tmp/whl
# 离线安装所有pip包
RUN pip install --no-index --find-links=/tmp/whl /tmp/whl/*.whl

2. Kafka 网络适配

你的服务依赖 Kafka(Broker:192.168.74.97:9092):

  • 容器内访问宿主机 Kafka:启动容器增加 --net=host 参数共享宿主机网络

bash

运行

复制代码
docker run -d --net=host --name rail_algo rail_algo_service:0603
  • 若 Kafka 是容器服务,使用 docker 网络互通。

3. 报错避坑

  1. docker load 只能导入 docker save 导出的 tar:你之前的 Miniconda 压缩包不是镜像包,不能用 load;
  2. 权限问题:代码目录、miniconda 包权限不足时,构建前执行 chmod 755 文件名
  3. 镜像体积过大:优先用方案 A(环境清单),不要直接拷贝完整 conda 目录;
  4. 启动脚本 start.sh 缺少执行权限:构建前给脚本加权限 chmod +x start.sh

Linux镜像部分

方案 B(最简替代,不用打包系统根目录)

如果你觉得打包整个系统体积太大,提前在外网机器导出 centos:7 镜像文件传到内网导入:

  1. 外网机器执行:

bash

运行

复制代码
docker pull centos:7
docker save -o centos7.tar centos:7
  1. 内网服务器导入(一次导入永久本地缓存,后续构建不再联网):

bash

运行

复制代码
docker load -i /home/app/algo/centos7.tar

导入后你原来带 FROM centos:7 的 Dockerfile 就能正常构建,不会再请求外网。

Docker 缓存机制:RUN 安装miniconda 这一层被缓存复用,镜像里 /opt/miniconda3 已经存在,再执行 conda env create 就报前缀已存在。

方案 1:构建时彻底禁用缓存(最快临时解决)

bash

运行

复制代码
docker build --no-cache -t rail_algo_service:0603 .

--no-cache 完全不使用任何缓存,每一层重新执行,不会复用旧的 miniconda 安装层。

方案 2:永久修复 Dockerfile,把创建环境合并进安装步骤,只一条 RUN

直接全量替换你的 Dockerfile:

dockerfile

复制代码
FROM centos:7
COPY Miniconda3-py312_24.5.0-0-Linux-x86_64.sh /tmp/
COPY linux-pip/linux-pip /tmp/wheels

RUN bash /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh -b -p /opt/miniconda3 \
&& rm -rf /tmp/*.sh \
&& /opt/miniconda3/bin/pip install --no-index --find-links=/tmp/wheels /tmp/wheels/*.whl \
&& /opt/miniconda3/bin/conda clean -y --all

ENV PATH="/opt/miniconda3/bin:$PATH"
ENV CONDA_DEFAULT_ENV=base

WORKDIR /app
COPY . .

CMD ["bash","start.sh"]

执行流程

  1. vim Dockerfile 清空原有内容,粘贴上面代码保存

  2. 执行无缓存构建

  3. bash

    运行

    复制代码
    docker build --no-cache -t rail_algo_service:0603 .

    原理说明

    之前分多条 RUN 会分层缓存:

  4. 第一层安装 miniconda(缓存)

  5. 后面再执行 conda 命令,系统目录已存在,直接报错 现在所有 conda/pip 操作合并一条 RUN,一次性执行,不存在目录残留冲突。

结果:构建成功了!

看日志最后几行:

plaintext

复制代码
exporting to image
writing image
naming to docker.io/library/rail_algo_service:0603

镜像已经正常打包完成,没有报错。

下一步操作

  1. 查看镜像确认存在

bash

运行

复制代码
docker images | grep rail_algo_service
  1. 启动容器(内网 kafka 需要共享宿主机网络)

bash

运行

复制代码
docker run -d --net=host --name rail_algo0603 rail_algo_service:0603
  1. 查看容器运行状态

bash

运行

复制代码
docker ps | grep rail_algo0603

补充说明

之前旧的报错是你没删掉 conda env create 那一段,现在修改 Dockerfile 删除后,全程只用本地离线 pip 安装,不再访问 anaconda 外网源,构建顺利走完。