【问题标题】:File not found error (Bash operator) : Apache airflow running on Docker找不到文件错误(Bash 运算符):在 Docker 上运行的 Apache 气流
【发布时间】:2020-11-13 16:18:45
【问题描述】:

我正在尝试在Docker 上使用Apache Airflow 运行bash 脚本

这是我正在运行的 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

当我运行Airflow DAG 时,它会显示这个error

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

【问题讨论】:

    标签: python docker docker-compose airflow


    【解决方案1】:

    问题是脚本aus.shdpd.sh不在docker容器中。您也可以通过映射这些文件来解决此问题。例如

            volumes:
                - ./dags:/usr/local/airflow/dags
                - ./scripts:/usr/local/airflow/scripts
                - /home/anti/Documents/logistics/ariflowtest:/scripts
                # - ./plugins:/usr/local/airflow/plugins
    

    在 dag 代码中,您必须将 bash_command="/aus.sh " 更改为 bash_command="/scripts/aus.sh "dpd.sh 也是如此。

    【讨论】:

    • 文件位置是 /home/anti/Documents/logistics/ariflowtest 。我需要将文件复制到您在答案/usr/local/airflow/scripts 中提供的位置吗?
    • 我以为脚本在挂载的文件夹中。一般来说,如果你想在容器中使用某些东西,你必须要么将它放在图像中,要么通过 docker-compose.yml 映射它(或使用正确的 docker 参数)
    • 这里的牛肉是,根据错误消息,它绝对不在.;所以你必须正确指定它的位置。
    【解决方案2】:

    您使用的是./home/anti/Documents/logistics/ariflowtest/aus.sh,您几乎可以肯定是指/home/anti/Documents/logistics/ariflowtest/aus.sh,前面没有一个点。

    简而言之,您正在当前目录中查找名为home 的目录,在该目录内部是anti,在该目录内部是Documents;大概真正的位置在根目录中的home 内。

    或许也可以看看Difference between ./ and ~/

    【讨论】:

    • 问题主要是文件没有在docker容器中“映射”。您所指的路径被分配给一个从未使用过的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多