Docker中的气流initdb引发ImportError:无法导入名称'import_string'

时间:2020-04-21 10:58:07

标签: python docker docker-compose airflow

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

2 个答案:

答案 0 :(得分: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中,然后重做上面的操作,直到发现潜在的问题为止

答案 1 :(得分:0)

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

我建议检查环境中使用的气流,烧瓶和werkzueg的版本。可能您需要按照here的方式固定flask或werkzueg的版本。