簡體   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