Airflow 运行 python 文件因 python 而失败:无法打开文件
Airflow running python files fails due to python: can't open file
我的 project
中有这样一个文件夹树
- 项目
- dags
- python_scripts
- 图书馆
- docker-compose.yml
- Docker 文件
- docker_resources
我在 docker 容器中创建了一个气流服务:
dockerfile
#Base image
FROM puckel/docker-airflow:1.10.1
#Impersonate
USER root
#Los automatically thrown to the I/O strem and not buffered.
ENV PYTHONUNBUFFERED 1
ENV AIRFLOW_HOME=/usr/local/airflow
ENV PYTHONPATH "${PYTHONPATH}:/libraries"
WORKDIR /
#Add docker source files to the docker machine
ADD ./docker_resources ./docker_resources
#Install libraries and dependencies
RUN apt-get update && apt-get install -y vim
RUN pip install --user psycopg2-binary
RUN pip install -r docker_resources/requirements.pip
Docker-compose.yml
version: '3'
services:
postgres:
image: postgres:9.6
container_name: "postgres"
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
ports:
- "5432:5432"
webserver:
build: .
restart: always
depends_on:
- postgres
volumes:
- ./dags:/usr/local/airflow/dags
- ./libraries:/libraries
- ./python_scripts:/python_scripts
ports:
- "8080:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
scheduler:
build: .
restart: always
depends_on:
- postgres
volumes:
- ./dags:/usr/local/airflow/dags
- ./logs:/usr/local/airflow/logs
ports:
- "8793:8793"
command: scheduler
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-scheduler.pid ]"]
interval: 30s
timeout: 30s
retries: 3
我的 dag 文件夹有一个教程:
from datetime import timedelta
# The DAG object; we'll need this to instantiate a DAG
from airflow import DAG
# Operators; we need this to operate!
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
# These args will get passed on to each operator
# You can override them on a per-task basis during operator initialization
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': days_ago(2),
'email': ['xxx@xxx.com '],
'email_on_failure': False,
'email_on_retry': False,
'retries': 0,
'retry_delay': timedelta(minutes=5),
'schedule_interval': '@daily',
}
dag = DAG(
'Tutorial',
default_args=default_args,
description='A simple tutorial DAG with production tables',
catchup=False
)
task_1 = BashOperator(
task_id='my_task',
bash_command='python /python_scripts/my_script.py',
dag=dag,
)
我试过改变 bash_command='python /python_scripts/my_script.py',
对于:
bash_command='python python_scripts/my_script.py',
bash_command='python ~/../python_scripts/my_script.py',
bash_command='python ~/python_scripts/my_script.py',
所有这些都失败了。我尝试了它们,因为 BashOperator
运行 tmp
文件夹中的命令。
如果我进入机器,并使用 运行 ls
命令,我会在 python_scripts
下找到该文件。
即使我 运行 python /python_scripts/my_script.py
来自 /usr/local/airflow
它也有效。
错误总是:
INFO - python: can't open file
我搜索过,有人用绝对路径解决了这个问题,但我无法解决。
编辑
如果在 docker 文件中,我在 WORKDIR /
下面添加 ADD ./ ./
我从 docker-compose.yml
:
中删除了这些卷
1. ./libraries:/libraries
2. ./python_scripts:/python_scripts
错误不是找不到文件,而是找不到库。 Import module error
。这是一项改进,但没有意义,因为 PYTHONPATH
被定义为具有 /libraries
文件夹。
比 ADD
语句更有意义,因为我需要将更改立即应用到代码中 docker.
编辑 2:
已安装卷但容器文件夹内没有文件,这就是无法找到文件的原因。当 运行 添加 ./ ./ 文件夹中有文件时,会在文件夹中添加所有文件。尽管它不起作用,因为既没有找到库。
你试过了吗
bash_command='python /usr/local/airflow/python_scripts/my_script.py'
并且您必须检查该文件夹是否具有良好的权限(为您的用户访问和执行)
最后我解决了这个问题,我放弃了所有以前的工作,并使用 UBUNTU
基础图像而不是基于 [=13= 的 puckel/docker-airflow
图像重新启动 DOCKERFILE
].
我不使用非 root 知道的任何其他用户。
我的 project
- 项目
- dags
- python_scripts
- 图书馆
- docker-compose.yml
- Docker 文件
- docker_resources
我在 docker 容器中创建了一个气流服务:
dockerfile
#Base image
FROM puckel/docker-airflow:1.10.1
#Impersonate
USER root
#Los automatically thrown to the I/O strem and not buffered.
ENV PYTHONUNBUFFERED 1
ENV AIRFLOW_HOME=/usr/local/airflow
ENV PYTHONPATH "${PYTHONPATH}:/libraries"
WORKDIR /
#Add docker source files to the docker machine
ADD ./docker_resources ./docker_resources
#Install libraries and dependencies
RUN apt-get update && apt-get install -y vim
RUN pip install --user psycopg2-binary
RUN pip install -r docker_resources/requirements.pip
Docker-compose.yml
version: '3'
services:
postgres:
image: postgres:9.6
container_name: "postgres"
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
ports:
- "5432:5432"
webserver:
build: .
restart: always
depends_on:
- postgres
volumes:
- ./dags:/usr/local/airflow/dags
- ./libraries:/libraries
- ./python_scripts:/python_scripts
ports:
- "8080:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
scheduler:
build: .
restart: always
depends_on:
- postgres
volumes:
- ./dags:/usr/local/airflow/dags
- ./logs:/usr/local/airflow/logs
ports:
- "8793:8793"
command: scheduler
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-scheduler.pid ]"]
interval: 30s
timeout: 30s
retries: 3
我的 dag 文件夹有一个教程:
from datetime import timedelta
# The DAG object; we'll need this to instantiate a DAG
from airflow import DAG
# Operators; we need this to operate!
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
# These args will get passed on to each operator
# You can override them on a per-task basis during operator initialization
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': days_ago(2),
'email': ['xxx@xxx.com '],
'email_on_failure': False,
'email_on_retry': False,
'retries': 0,
'retry_delay': timedelta(minutes=5),
'schedule_interval': '@daily',
}
dag = DAG(
'Tutorial',
default_args=default_args,
description='A simple tutorial DAG with production tables',
catchup=False
)
task_1 = BashOperator(
task_id='my_task',
bash_command='python /python_scripts/my_script.py',
dag=dag,
)
我试过改变 bash_command='python /python_scripts/my_script.py',
对于:
bash_command='python python_scripts/my_script.py',
bash_command='python ~/../python_scripts/my_script.py',
bash_command='python ~/python_scripts/my_script.py',
所有这些都失败了。我尝试了它们,因为 BashOperator
运行 tmp
文件夹中的命令。
如果我进入机器,并使用 运行 ls
命令,我会在 python_scripts
下找到该文件。
即使我 运行 python /python_scripts/my_script.py
来自 /usr/local/airflow
它也有效。
错误总是:
INFO - python: can't open file
我搜索过,有人用绝对路径解决了这个问题,但我无法解决。
编辑
如果在 docker 文件中,我在 WORKDIR /
下面添加 ADD ./ ./
我从 docker-compose.yml
:
1. ./libraries:/libraries
2. ./python_scripts:/python_scripts
错误不是找不到文件,而是找不到库。 Import module error
。这是一项改进,但没有意义,因为 PYTHONPATH
被定义为具有 /libraries
文件夹。
比 ADD
语句更有意义,因为我需要将更改立即应用到代码中 docker.
编辑 2: 已安装卷但容器文件夹内没有文件,这就是无法找到文件的原因。当 运行 添加 ./ ./ 文件夹中有文件时,会在文件夹中添加所有文件。尽管它不起作用,因为既没有找到库。
你试过了吗
bash_command='python /usr/local/airflow/python_scripts/my_script.py'
并且您必须检查该文件夹是否具有良好的权限(为您的用户访问和执行)
最后我解决了这个问题,我放弃了所有以前的工作,并使用 UBUNTU
基础图像而不是基于 [=13= 的 puckel/docker-airflow
图像重新启动 DOCKERFILE
].
我不使用非 root 知道的任何其他用户。