【问题标题】:airflow initdb in Docker throws ImportError: cannot import name 'import_string'Docker 中的气流 initdb 抛出 ImportError: cannot import name 'import_string'
【发布时间】:2020-04-21 10:58:07
【问题描述】:

我正在尝试 dockerize 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

如果相关:airflow-start.sh

airflow.cfg:

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

【问题讨论】:

    标签: python docker docker-compose airflow


    【解决方案1】:

    如果可能的话,让你的代码在不接触 docker 的情况下运行......直接在你的主机上运行它......当然这意味着你的主机(你的笔记本电脑或任何你正在执行命令的地方,可能是一个远程 VPS debian 盒子)必须与您的 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 中,然后重做上述操作,直到发现潜在问题

    【讨论】:

    • 我试过了,在同一个命令下得到了同样的错误。即使我不知道如何使用该命令行来执行network_mode: host 以使其访问主机数据库,但不幸的是,我什至没有达到那个问题发生的地步。另外,我使用的是MacOS,我使用的是airflowpython的版本,我过去也在Ubuntu上使用过它,但在docker上它给出了这个错误。
    【解决方案2】:

    这很可能与 werkzeug 包中的气流错误有关,或者您的要求可能会破坏某些东西。

    我建议检查环境中使用的气流、烧瓶和 werkzueg 的版本。您可能需要固定flask 或werkzueg 的版本,如here 所述。

    【讨论】:

      猜你喜欢
      • 2016-12-21
      • 2015-09-07
      • 1970-01-01
      • 2022-08-20
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多