繁体   English   中英

Docker 中的 airflow initdb 抛出 ImportError: cannot import name 'import_string'

[英]airflow initdb in Docker throws ImportError: cannot import name 'import_string'

我正在尝试 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的output正常出现,每一步执行然后

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

如果可能的话,让您的代码在不接触 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 并重做上面,直到你发现潜在的问题

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM