[英]Django: "cannot import name import_string" while using "rest_framework_docs"
[英]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.