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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:36