如何将Flink作业与Java应用打包为Docker镜像并通过docker-compose自动运行?
自动化打包Flink应用并随容器启动运行
核心方案
基于官方Flink镜像构建自定义镜像,将自研应用的fat jar嵌入镜像中,搭配启动脚本实现「启动JobManager→等待就绪→自动提交作业」的全流程自动化,再用docker-compose编排JobManager+TaskManager的单节点集群。每个应用独立维护一套配置,完全隔离,启动容器即自动运行作业,无需手动上传或调用外部API。
具体实现步骤
1. 单个应用的目录结构
每个Flink应用单独维护独立目录,结构如下:
my-flink-app/ ├── Dockerfile # 自定义镜像构建文件 ├── docker-compose.yml # 集群编排配置 ├── start-job.sh # 自动启动+提交作业的脚本 └── my-app-fat.jar # 你的自研应用fat jar包
2. 编写Dockerfile
基于官方Flink镜像,复制jar包和启动脚本,替换默认入口:
# 选择匹配你应用的Flink版本,这里以1.17-scala_2.12为例 FROM flink:1.17-scala_2.12 # 将fat jar复制到Flink的用户jar目录 COPY my-app-fat.jar /opt/flink/usrlib/ # 复制启动脚本并赋予执行权限 COPY start-job.sh /opt/flink/bin/ RUN chmod +x /opt/flink/bin/start-job.sh # 设置容器入口为自定义启动脚本 ENTRYPOINT ["/opt/flink/bin/start-job.sh"]
3. 编写自动提交作业的脚本start-job.sh
脚本负责启动JobManager、等待就绪、提交作业,确保容器持续运行:
#!/bin/bash # 启动Flink JobManager(后台运行) echo "Starting Flink JobManager..." $FLINK_HOME/bin/jobmanager.sh start-foreground & # 轮询JobManager的REST API,确认就绪 echo "Waiting for JobManager to be ready..." until curl -s http://localhost:8081/jobs > /dev/null; do sleep 3 done # 提交作业,可根据需求调整并行度、自定义参数 echo "Submitting Flink job..." $FLINK_HOME/bin/flink run -d /opt/flink/usrlib/my-app-fat.jar \ -p 2 \ # 设置作业并行度,和TaskManager的slot数匹配 --custom-param your-value # 传递应用需要的自定义参数 # 保持容器前台运行,避免启动后退出 wait
4. 编写docker-compose.yml
编排JobManager和TaskManager,确保两者通信正常:
version: "3.8" services: jobmanager: build: . ports: - "8081:8081" # 暴露Web UI端口,方便查看作业状态 - "6123:6123" # JobManager RPC端口 environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 volumes: - ./logs:/opt/flink/logs # 挂载日志目录,方便排查问题 taskmanager: image: flink:1.17-scala_2.12 # 可直接用官方镜像,也可复用JobManager的自定义镜像 depends_on: - jobmanager environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 volumes: - ./taskmanager-logs:/opt/flink/logs
5. 构建并启动集群
在应用目录下执行命令:
# 构建自定义镜像 docker-compose build # 后台启动整个集群 docker-compose up -d
关键注意事项
- 多应用隔离:每个应用单独维护上述目录,各自构建镜像,完全独立,满足后续新增应用的需求。
- 版本匹配:确保Dockerfile和docker-compose.yml使用的Flink版本一致,避免兼容性问题。
- 资源调整:根据应用负载修改
taskmanager.numberOfTaskSlots和作业并行度,必要时在docker-compose中添加deploy.resources配置限制CPU/内存。 - 动态参数:如果应用需要动态参数,可通过docker-compose的
environment传递,在启动脚本中读取环境变量替换到flink run命令中。
内容的提问来源于stack exchange,提问作者MahZars
相关产品推荐
相关产品推荐

