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容器中“映射”。您引用的路径被指定给从未使用过的变量。