我每天使用Airflow运行一次DockerOperator
任务。由于不推荐使用auto_remove
自变量,我将BashOperator
与docker rm
命令结合使用以清除退出的容器。该命令作为应在docker operator任务之后运行的下游任务执行。我一直在寻找一种即使父代失败也总是执行下游任务的方法。我发现trigger_rule参数正是我使用all_done
选项所寻找的,但是如果容器因错误代码而停止并且任务重试,则下游任务不会执行,则容器保持并且下一次尝试失败,因为容器名称已经存在。
有没有一种方法可以在每次重试时运行下游任务?
注意:我不想删除容器名称,因为我不想让容器堆积。
with DAG(DAG_ID, default_args=default_args, schedule_interval=SCHEDULE_INTERVAL, catchup=CATCHUP) as dag:
docker_launch_container = DockerOperator(
task_id='docker_launch_container',
image='my_custom_image',
api_version='auto',
container_name='my_custom_container',
)
docker_remove_container = BashOperator(
task_id='docker_remove_container',
bash_command="docker rm $(docker ps -a | grep my_custom_container | grep Exited | awk '{print $1}')",
trigger_rule='all_done'
)
docker_launch_container >> docker_remove_container