【问题标题】:FileNotFoundError: [Errno 2] No such file or directory when a task tried to save a fileFileNotFoundError:[Errno 2] 任务尝试保存文件时没有这样的文件或目录
【发布时间】:2021-02-22 10:12:12
【问题描述】:

我正在尝试将 csv 文件的内容复制到 postgres 数据库中,在两个任务中,第一个任务下载 csv 文件并将其保存在 /temp 文件夹中,另一个是将元素复制到的 postgres 任务数据库。但是,当尝试将文件保存到 dag 文件夹之外时,任务无法保存文件并出现 filenotfound 错误。

保存文件的可调用函数:

def get_events(country_code,start_date, max_days = 365):
    AIRFLOW_HOME = os.getenv('AIRFLOW_HOME')
    iterate_date = start_date
    has_events = False
    for i in range(0, max_days):
        try:
            results = get_event_perday_bycountry(start_date, country_code)
            print(iterate_date)
            if not results.empty:
                results.to_csv('/mnt/c/Users/heyas/project/STOCK/temp/data.csv' ,index = False, mode = "a", header = False)
                has_events = True
        except ValueError as err:
            print(err)
        iterate_date -= timedelta(days=1)
    if has_events:
        print("events Pulled")
    else:
        print("No events obtained.")

我之前使用 AIRFLOW_HOME 变量将文件保存在 dag 文件夹中,但我的 postgres 无法从那里复制 csv 文件的内容。

AIRFLOW+ Postgres 的 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"
        volumes:
            - ./setup/raw_input_data:/data
            - ./temp:/temp
        ports:
            - "5432:5432"
    webserver:
        image: puckel/docker-airflow:1.10.9
        restart: always
        depends_on:
            - postgres
        environment:
            - LOAD_EX=n
            - EXECUTOR=Local
            - AIRFLOW_CONN_POSTGRES_DEFAULT=postgres://airflow:airflow@postgres:5432/airflow
            - FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho=
        logging:
            options:
                max-size: 10m
                max-file: "3"
        volumes:
            - ./dags:/usr/local/airflow/dags
            - ./temp:/temp
            # - ./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

我试图通过将文件直接保存在我的目录 /temp 文件夹中来解决它:

├── Postgre
├── __pycache__
├── dags
│   ├── __pycache__
│   ├── data
│   ├── gdelt
│   │   └── __pycache__
│   ├── gdelt-0.1.10.dist-info
│   └── scripts
├── setup
│   ├── raw_input_data
│   └── temp
└── temp

如何将文件保存在 temp 文件夹中,或者在我的目录中放置 Postgres 和 AIRFLOW 之间的公用文件夹?

【问题讨论】:

    标签: python postgresql docker airflow


    【解决方案1】:

    您需要运行以下命令来映射卷以在容器和主机之间共享数据

    在这里查看答案copy file from docker to host system using python script

    【讨论】:

    • 好吧,我会试一试,即使我使用 WSL 2 作为开发环境
    • @MouhssineMiftah ok 就在 results_to_csv 的顶部将以下内容打印到控制台 print(os.getwd())
    • 您好,感谢您的建议,输出为“/usr/local/airflow”
    • 嗯,我明白了,所以要将文件从 docker 容器内复制到主机系统,您需要将容器外部的目录映射到运行容器时的内部目录,我正在更新我的现在回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2019-11-03
    • 2021-08-24
    • 2021-03-07
    • 2015-06-09
    • 2021-04-01
    • 2021-10-15
    相关资源
    最近更新 更多