initdb воздушного потока в Docker выдает ImportError: невозможно импортировать имя 'import_string' - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь докеризировать airflow, мой Dockerfile выглядит так

FROM python:3.5.2

RUN mkdir -p /src/airflow
RUN mkdir -p /src/airflow/logs
RUN mkdir -p /src/airflow/plugins
WORKDIR /src
COPY . .
RUN pip install psycopg2
RUN pip install -r requirements.txt
COPY airflow.cfg /src/airflow
ENV AIRFLOW_HOME /src/airflow
ENV PYTHONPATH "${PYTHONPATH}:/src"
RUN airflow initdb
EXPOSE 8080
ENTRYPOINT ./airflow-start.sh

, а мой docker-compose.yml выглядит следующим образом

version: "3"
services:
  airflow:
    container_name: airflow
    network_mode: host
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:8080

Вывод $ docker-compose build появляется как обычно, каждый шаг выполняется, а затем

Step 12/14 : RUN airflow initdb
 ---> Running in 8b7ebe406978
[2020-04-21 10:34:21,419] {__init__.py:45} INFO - Using executor LocalExecutor
Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 17, in <module>
    from airflow.bin.cli import CLIFactory
  File "/usr/local/lib/python3.5/site-packages/airflow/bin/cli.py", line 59, in <module>
    from airflow.www.app import cached_app
  File "/usr/local/lib/python3.5/site-packages/airflow/www/app.py", line 20, in <module>
    from flask_cache import Cache
  File "/usr/local/lib/python3.5/site-packages/flask_cache/__init__.py", line 24, in <module>
    from werkzeug import import_string
ImportError: cannot import name 'import_string'
ERROR: Service 'airflow' failed to build: The command '/bin/sh -c airflow initdb' returned a non-zero code: 1

postgres выполняется в хост-системе.
Я пробовал несколько способов, но это продолжается.
Я даже попробовал puckel/docker-airflow изображение, и произошла та же ошибка.
Может кто-нибудь сказать мне, что я делаю не так?


Структура проекта:

root
  -airflow_dags
  -Dockerfile
  -docker-compose.yml
  -airflow-start.sh
  -airflow.cfg

В случае необходимости: начало потока воздуха. sh

In airflow.cfg:

dags_folder = /src/airflow_dags/
sql_alchemy_conn = postgresql://airflow:airflow@localhost:5432/airflow

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Если возможно, запустите ваш код, не касаясь docker ... запустите его прямо на вашем хосте ... конечно, это означает, что ваш хост (ваш ноутбук или где вы выполняете свои команды, может быть удаленным блоком debian VPS) ) должна иметь ту же ОС, что и ваш Dockerfile, я вижу, что в этом случае FROM python:3.5.2 на самом деле использует debian 8

За исключением вышеперечисленного, запустите игрушечный контейнер, который еще ничего не выполняет и позволяет войти в него вручную Запустите ваши команды, чтобы помочь в устранении неполадок ... так что используйте следующий как Dockerfile этого игрушечного контейнера

FROM python:3.5.2

CMD ["/bin/bash"]

, так что теперь выпустите этот

docker build --tag saadi_now .   # creates image saadi_now

, теперь запустите этот образ

docker run -d  saadi_now  sleep infinity # launches container 

docker ps         #  lets say its container_id is b91f8cba6ed1

теперь войдите в этот работающий контейнер

docker exec -ti  b91f8cba6ed1 bash

круто, теперь вы находитесь внутри контейнера docker, поэтому запускайте команды, которые изначально были в реальном Dockfile ... это иногда облегчает поиск и устранение неисправностей

один за другим добавьте в эту игрушку Dockerfile свои фактические команды из реального Dockerfile и повторяйте выше, пока не обнаружите нижележащий г выдает

0 голосов
/ 23 апреля 2020

Скорее всего, это связано либо с ошибкой в ​​потоке воздуха в пакете werkzeug, либо с вашими требованиями, возможно, что-то стучит.

Я рекомендую проверить версии воздушных потоков, flask и werkzueg, которые используются в окружающей среде. Возможно, вам понадобится закрепить версию flask или werkzueg, как обсуждено здесь .

...