Docker化Apache Beam运行容器返回“No id provided”错误如何解决?
错误根源
你使用的apache/beam_python3.8_sdk:latest是Apache Beam官方的工作节点(Worker)专用镜像,默认内置的入口点是Beam Worker启动程序(对应你查到的boot.go程序),你在Dockerfile中定义的CMD会被默认入口点覆盖,所以容器启动后根本没有运行你写的analysis.py,而是直接启动了Beam Worker进程。
你遇到的No id provided报错,缺失的是Beam Worker节点ID,这个ID是上层作业调度服务(例如Flink Master、Spark Master、Google Dataflow服务)在分配Worker资源时自动传入的参数,手动直接启动Worker镜像没有调度端传入的ID参数,就会触发该报错。
修复方案
有两种可行修复方式,按需选择即可:
方案1:更换基础镜像(推荐)
如果你要在容器内直接运行Beam Driver端代码(即你自己写的作业提交代码),直接使用普通Python基础镜像即可,无需使用Beam Worker镜像,修改后的Dockerfile参考:
FROM python:3.8-slim RUN apt update RUN apt install -y wget curl unzip git COPY ./ /root/data_analysis/ WORKDIR /root/data_analysis RUN python3 -m pip install -r data_analysis/beam/requirements.txt ENV PYTHONPATH=/root/data_analysis CMD python3 data_analysis/analysis.py
重新构建镜像后运行即可正常输出执行结果。
方案2:覆盖默认入口点
如果需要保留现有基础镜像,启动容器时手动覆盖默认的ENTRYPOINT即可跳过Beam Worker启动逻辑,直接运行你的业务代码:
docker run --name=beam --entrypoint="" beam python3 data_analysis/analysis.py
你也可以直接在Dockerfile中添加ENTRYPOINT []清除默认入口点,后续启动就不需要额外加参数。
内容的提问来源于stack exchange,提问作者Jakub Czaplicki
相关产品推荐
相关产品推荐

