project
にこのようなフォルダツリーがあります
私はDockerコンテナーでAirflowサービスを作成します:
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': ['[email protected] '],
'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
を実行しても機能します。
エラーは常に:
情報-Python:ファイルを開けません
私は検索し、人々は絶対パスで問題を解決しましたが、それを修正することはできません。
編集 dockerfileでADD ./ ./
をWORKDIR /
の下に追加し、docker-compose.yml
からこれらのボリュームを削除した場合:
1. ./libraries:/libraries
2. ./python_scripts:/python_scripts
エラーはファイルが見つかりません、ライブラリが見つかりません。 Import module error
。これは改善ですが、PYTHONPATH
が/libraries
フォルダを持つように定義されているため、意味がありません。
ADD
ステートメントよりもボリュームを理解しやすくなります。変更をコードに即座に適用してDockerに適用する必要があるためです。
編集2:ボリュームはマウントされていますが、コンテナフォルダ内にファイルがありません。これがファイルを見つけることができない理由です。 Add ./ ./を実行すると、フォルダーにファイルが含まれているため、フォルダー内のすべてのファイルが追加されます。ライブラリは機能しませんが、ライブラリも見つからないためです。
最後に問題を解決し、以前のすべての作業を破棄し、puckel/docker-airflow
に基づくpython:3.7-slim-buster
イメージではなくDOCKERFILE
ベースイメージを使用してUBUNTU
を再起動しました。
Rootが知らない他のユーザーは使用しません。