Airflow 2.7.1中SSHOperator报FileNotFoundError问题求助
问题分析与解决方案
核心原因:Airflow运行在Docker容器内部,容器拥有独立的文件系统,你宿主机(Airflow虚拟机)上的/home/ubuntu/.ssh/id_rsa并未同步到容器内部,导致容器找不到该私钥文件。而你直接在虚拟机上SSH能成功,是因为虚拟机本地存在这个文件,和容器环境完全隔离。
以下是具体解决步骤:
1. 检查Airflow SSH连接配置
登录Airflow UI,进入Admin -> Connections找到ssh_test连接:
- 如果配置的是私钥路径:确保路径是容器内部存在的路径(而非宿主机路径),默认容器内运行用户是
airflow,所以路径应该是/home/airflow/.ssh/id_rsa而非/home/ubuntu/.ssh/id_rsa。 - 更稳妥的方式:直接在
Private Key字段粘贴私钥的文本内容(清空文件路径配置),这样无需依赖容器内的文件,直接使用连接中存储的私钥。
2. 映射宿主机私钥到Docker容器
如果坚持使用文件路径方式,需要修改Airflow的docker-compose.yml,将宿主机的私钥和known_hosts文件映射到容器内:
在airflow-worker和airflow-webserver的volumes节点下添加:
volumes: # 保留原有volume配置 - /home/ubuntu/.ssh/id_rsa:/home/airflow/.ssh/id_rsa:ro - /home/ubuntu/.ssh/known_hosts:/home/airflow/.ssh/known_hosts:ro
:ro表示只读,避免容器修改宿主机文件。- 映射后重启容器:
docker-compose down && docker-compose up -d
3. 修正容器内私钥权限
SSH要求私钥权限必须为600(仅所有者可读可写),否则会拒绝使用。映射后进入容器设置权限:
# 给worker容器设置权限 docker exec -it airflow-worker chmod 600 /home/airflow/.ssh/id_rsa # 给webserver容器设置权限(如需在webserver测试) docker exec -it airflow-webserver chmod 600 /home/airflow/.ssh/id_rsa
4. 验证容器内私钥是否存在
进入容器检查文件是否存在且权限正确:
docker exec -it airflow-worker ls -l /home/airflow/.ssh/
输出应显示id_rsa文件,权限为-rw-------。
完成以上步骤后,重新运行你的DAG即可正常建立SSH连接。
内容的提问来源于stack exchange,提问作者Joe Yong
相关产品推荐
相关产品推荐

