Prefect Docker Agent执行Flow完成后无法更新服务端状态问题求助
问题根因
报错并非来自Docker Agent本身,而是运行在独立Docker容器中的Flow进程,无法访问宿主机上部署的Prefect Server API接口。你之前修改的是Agent连接Server的地址,该配置仅作用于Agent进程本身,不会传递给Flow运行的容器环境,因此修改Agent的-a参数无法解决问题。
解决方法
你可以任选以下任意一种方式配置:
方式1:在Flow的DockerRun配置中指定访问地址(单Flow生效)
修改你的Flow代码,在DockerRun中补充环境变量和主机解析配置:
import prefect from prefect import task, Flow from prefect.run_configs import DockerRun @task def say_hello(): logger = prefect.context.get("logger") logger.info("Hello, docker!") with Flow("docker-hello-flow") as flow: # 补充配置:指定Flow容器访问Prefect Server的地址,以及宿主机解析 flow.run_config = DockerRun( env={"PREFECT__SERVER__HOST": "172.17.0.1"}, extra_hosts={"host.docker.internal": "172.17.0.1"} ) say_hello() # Register the flow under the "tutorial" project flow.register(project_name="tutorial")
修改后重新注册Flow即可生效。
方式2:在启动Docker Agent时全局配置(所有该Agent调度的Flow都生效)
启动Agent时增加环境变量传递参数,无需修改现有Flow代码:
prefect agent docker start -l parami --log-level DEBUG --show-flow-logs \ --env PREFECT__SERVER__HOST=172.17.0.1 \ --extra-hosts host.docker.internal:172.17.0.1
补充说明
172.17.0.1是Docker默认网桥下宿主机的网关地址,绝大多数Linux环境下默认使用该地址。如果你的Docker有自定义网桥配置,可以执行docker network inspect bridge,在返回结果中找到Gateway字段对应的地址替换即可。
Windows和Mac系统下Docker默认支持host.docker.internal解析,如遇同类问题也可参照上述方案替换为对应宿主机地址即可。
内容的提问来源于stack exchange,提问作者Anders Lindstrom
相关产品推荐
相关产品推荐

