Docker Compose离线批处理需预拉取并导入所有镜像,YAML中设restart: "no"、用command指定脚本、volumes挂载数据目录,通过.env变量模板化路径,执行docker-compose up--remove-orphans后验证退出码与输出文件。

Docker Compose 本身不联网,它只是读取 YAML 文件、调用本地 Docker 引擎启动容器。所谓“离线数据处理批处理”,关键在于:所有镜像必须提前拉取并导入,所有代码/脚本/配置/输入数据都打包进镜像或挂载进容器,整个流程不依赖任何外部网络请求。
准备可离线运行的镜像
不能在内网服务器上执行 docker pull,必须在有网环境完成全部镜像获取与保存:
- 在联网机器上运行
docker pull python:3.11-slim、docker pull openjdk:17-jre-slim等基础镜像,以及你自建的处理镜像(如my-etl-job:1.2) - 用
docker save -o etl-images.tar python:3.11-slim my-etl-job:1.2打包多个镜像为单个 tar 文件 - 将 tar 文件复制到内网服务器,执行
docker load -i etl-images.tar导入镜像 - 验证:运行
docker images应能看到全部镜像,且REPOSITORY列无<none>
编写面向批处理的 docker-compose.yml
批处理强调一次性执行、自动退出、结果可追溯。YAML 需体现任务语义,而非长期服务:
- 使用
restart: "no"(默认值),避免失败后无限重试 - 用
command:覆盖镜像默认 CMD,明确指定处理脚本路径和参数,例如["python", "/app/process.py", "--input", "/data/in/", "--output", "/data/out/"] - 通过
volumes:挂载宿主机目录,确保输入数据就位、输出结果落盘,例如:- /mnt/batch/input:/data/in:ro- /mnt/batch/output:/data/out:rw- /mnt/batch/logs:/app/logs:rw - 可加
environment:设置批次 ID、时间戳等上下文变量,便于日志归档与审计
执行与结果确认
启动即运行,完成即退出,不需守护进程:
- 运行
docker-compose up --remove-orphans启动任务(加--remove-orphans防止残留旧容器干扰) - 观察终端输出,或用
docker-compose logs -f实时跟踪 - 任务结束后,检查退出码:
echo $?应为 0;也可查容器状态:docker-compose ps中状态应为Exit 0 - 立即验证输出目录:
ls -l /mnt/batch/output/是否生成预期文件,大小是否合理
封装成可复用的离线作业模板
把固定结构抽出来,让每次新任务只需改少量参数:
- 创建
batch-template.yml,其中用${INPUT_DIR}、${OUTPUT_DIR}占位符代替具体路径 - 配合
.env文件管理变量:INPUT_DIR=/mnt/june_data/raw、OUTPUT_DIR=/mnt/june_data/processed - 执行时自动替换:
docker-compose --env-file .env up --remove-orphans - 把该模板连同预置镜像、脚本、env 示例一起打包为
etl-batch-v2.1-offline.zip,交付给内网团队开箱即用


















