Сбой потока python файлов из-за python: невозможно открыть файл - PullRequest
4 голосов
/ 17 марта 2020

У меня есть такое дерево папок в моем project

  • проекте
    • dags
    • python_scripts
    • библиотеки
    • docker -compose.yml
    • Dockerfile
    • 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: невозможно открыть файл

Я искал, и люди решили проблему с абсолютными путями, но я не могу ее исправить.

Редактировать Если в файле Docker добавить ADD ./ ./ ниже WORKDIR / и Я удаляю эти тома из docker-compose.yml:

 1. ./libraries:/libraries

 2. ./python_scripts:/python_scripts

Ошибка: файл не найден, библиотеки не найдены. Import module error. Что является улучшением, но не имеет смысла, поскольку в PYTHONPATH определена папка /libraries.

Имеет больше смысла в томах, что в операторе ADD, потому что мне нужно применить изменения в код мгновенно в docker.

Редактировать 2: Тома смонтированы, но внутри папок контейнера нет файлов, поэтому не может найти файлы. При запуске Добавить ./ ./ в папке есть файлы, потому что там добавляются все файлы внутри папки. Несмотря на то, что это не работает, библиотеки не найдены.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы пробовали

bash_command='python /usr/local/airflow/python_scripts/my_script.py' 

И вы должны проверить, имеют ли папка хорошие разрешения (доступ и выполнение для вашего пользователя)

0 голосов
/ 19 марта 2020

Наконец-то я решил проблему, отменил всю предыдущую работу и перезапустил DOCKERFILE, используя UBUNTU базовое изображение, а не puckel/docker-airflow изображение, основанное на python:3.7-slim-buster.

Я надеваю не используйте другого пользователя, которого он не знает root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...