Airflow中DockerSwarmOperator任务执行完成后持续处于运行状态求助
问题:Airflow DockerSwarmOperator任务持续处于Running状态,容器已正常执行完成
我在Airflow中配置了一个使用DockerSwarmOperator的任务,用于运行短期容器。容器已无错误执行完成(期望状态:Shutdown),但Airflow中的任务却一直处于“Running”状态,无法结束。
环境信息
- 服务器:Oracle Linux 9
- Airflow版本:2.4.2
- Docker部署在Linux服务器上
相关代码
start_dag = DummyOperator( task_id='start_dag' ) end_dag = DummyOperator( task_id='end_dag' ) hop = DockerSwarmOperator( task_id='Job_exec_HOP', image='apache/hop', api_version='auto', auto_remove=True, environment= { 'HOP_RUN_PARAMETERS': 'INPUT_DIR=', 'HOP_LOG_LEVEL': 'Basic', 'HOP_FILE_PATH': '${PROJECT_HOME}/J01_BIT_DW_VENTAS_NAVEGADOR.hwf', 'HOP_PROJECT_FOLDER': '/files/INDUTOP_BI_ETL', 'HOP_PROJECT_NAME': 'INDUTOP_BI_ETL', 'HOP_SHARED_JDBC_FOLDER': '/files/JDBC_FOLDER', 'HOP_RUN_CONFIG': 'local' }, docker_url="unix://var/run/docker.sock", network_mode="bridge", mounts=[Mount(source='/mnt/hop_bi_etl/hopdata', target='/files', type='bind')], force_pull=False ) start_dag >> hop >> end_dag
解决方法
1. 修正Docker套接字路径
docker_url参数存在路径错误,正确的Unix套接字路径需要三个斜杠:
docker_url="unix:///var/run/docker.sock"
错误路径会导致Airflow无法正常连接Docker API,无法获取容器/服务的状态更新,进而持续判定任务处于运行状态。
2. 调整auto_remove参数
将auto_remove=True改为auto_remove=False:
auto_remove=False
当容器被自动删除后,Airflow无法再查询到容器状态,会一直等待任务结束。后续可通过docker system prune等命令定期清理终止的容器。
3. 赋予Airflow Worker Docker权限
确保运行Airflow Worker的用户属于docker组,执行以下命令添加权限:
usermod -aG docker airflow
添加后重启Airflow Worker服务,否则Worker无法访问Docker套接字获取容器状态。
4. 显式指定服务等待状态
在DockerSwarmOperator中添加statuses参数,指定需要等待的服务终止状态:
statuses=["complete"]
Airflow默认可能仅监听running状态,显式指定complete状态可让Operator正确识别任务完成。
5. 检查Swarm服务状态
手动查看Swarm服务的运行状态,确认服务是否真的已完成:
docker service ls docker service ps <service-name>
若服务卡在异常状态,可手动清理服务,同时检查Swarm集群的健康状态。
内容的提问来源于stack exchange,提问作者Daniel Capone
相关产品推荐
相关产品推荐

