Python 找不到文件错误(Bash操作符):Apache airflow在Docker上运行
我正试图在Python 找不到文件错误(Bash操作符):Apache airflow在Docker上运行,python,docker,docker-compose,airflow,Python,Docker,Docker Compose,Airflow,我正试图在Docker 这是我正在运行的bash脚本 #!/bin/bash rootdir=/home/anti/Documents/logistics/ariflowtest crondir="$rootdir/cron/$(date "+%Y%m%d/%H")" mkdir -p "$crondir" /usr/bin/python3 "$rootdir/her.py" >> "$c
Docker
这是我正在运行的bash脚本
#!/bin/bash
rootdir=/home/anti/Documents/logistics/ariflowtest
crondir="$rootdir/cron/$(date "+%Y%m%d/%H")"
mkdir -p "$crondir"
/usr/bin/python3 "$rootdir/her.py" >> "$crondir/cron.log" 2>&1
当我运行气流DAG
时,它显示此错误
Running command: ./aus.sh
[2020-11-12 08:15:14,821] {{bash_operator.py:122}} INFO - Output:
[2020-11-12 08:15:14,823] {{bash_operator.py:126}} INFO - /tmp/airflowtmp_856j2oz/task_ausg7zzejtp: line 1: ./aus.sh: No such file or directory
我尝试传递脚本的相对路径,但不起作用
这是我的dag代码:
from airflow.models import DAG
from airflow.utils.dates import days_ago
from airflow.operators.python_operator import PythonOperator
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
import os
args={
'owner' : 'anti',
'start_date':days_ago(1)
}
dag = DAG(dag_id='sn_logistics2',default_args=args,schedule_interval='*/5 * * * *')
create_command_dpd = "./home/anti/Documents/logistics/ariflowtest/dpd.sh "
create_command_aus = "./home/anti/Documents/logistics/ariflowtest/aus.sh "
with dag:
dummy_operator = DummyOperator(task_id='mothertrigger',retries=3)
task_dpd=BashOperator(
task_id='task_dpd',
bash_command="/dpd.sh ",
#bash_command = create_command_dpd,
xcom_push=True,
dag=dag
)
task_aus=BashOperator(
task_id='task_aus',
bash_command="/aus.sh ",
#bash_command = create_command_aus,
xcom_push=True,
dag=dag
)
dummy_operator >> task_dpd
dummy_operator >> task_aus
我检查了我的dag文件夹是否已装入:
sudo docker inspect -f '{{ .Mounts }}' 1e6c9974a9f3
输出
[{bind /home/anti/Documents/dags /usr/local/airflow/dags rw true rprivate}]
我试图运行的脚本文件和docker compose文件位于两个不同的位置
脚本文件位于:
/home/anti/Documents/logistics/ariflowtest
docker compose位于:
/home/anti/Documents
我还确保文件夹正确安装在docker compose
文件中
version: '3.7'
services:
postgres:
image: postgres:9.6
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
logging:
options:
max-size: 10m
max-file: "3"
webserver:
image: puckel/docker-airflow:1.10.9
restart: always
depends_on:
- postgres
environment:
- LOAD_EX=y
- EXECUTOR=Local
logging:
options:
max-size: 10m
max-file: "3"
volumes:
- ./dags:/usr/local/airflow/dags
- ./scripts:/usr/local/airflow/scripts
# - ./plugins:/usr/local/airflow/plugins
ports:
- "8080:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
问题是脚本
aus.sh
和dpd.sh
不在docker容器中。您也可以通过映射这些文件来解决这个问题。e、 g
卷:
-/DAG:/usr/本地/气流/DAG
-/脚本:/usr/local/afflow/scripts
-/home/anti/Documents/logistics/ariflowtest:/scripts
#-。/插件:/usr/本地/气流/插件
在dag代码中,您必须将
bash_命令=“/aus.sh”
更改为bash_命令=“/scripts/aus.sh”
。您使用的/home/anti/Documents/logistics/ariflowtest/aus.sh
几乎肯定是指前面没有点的/home/anti/Documents/logistics/ariflowtest/aus.sh
简而言之,您正在当前目录中查找名为home
的目录,在该anti
目录中,以及在该文档中
;其中实际位置大概位于根目录中的home
也许还可以参见文件位置是
/home/anti/Documents/logistics/ariflowtest
。我需要将文件复制到您在回答中给出的位置吗?/usr/local/afflow/scripts
?我以为脚本在挂载文件夹中。一般来说,如果您想在容器中使用某个东西,您必须将它放在图像中,或者通过docker-compose.yml(或使用正确的docker参数)映射它。这里的要点是,根据错误消息,它肯定不在
中;因此,您必须正确指定文件的位置。问题主要是文件未在docker容器中“映射”。您引用的路径被指定给从未使用过的变量。