有人問過類似的問題,但我從未找到解決此問題的有效解決方案。
我有一個非常基本的 Docker 和 Flask 設定:
目錄結構:
├── Dockerfile
├── app
│ ├── __init__.py
│ └── constants.py
├── docker-compose.yml
└── requirements.txt
init .py的內容
from flask import Flask
from .constants import MYCONSTANT
def create_app():
"""Create the app."""
app = Flask(__name__)
@app.route('/', methods=['GET'])
def index():
return 'hello world'
return app
Dockerfile
FROM python:3.6-alpine
COPY requirements.txt /
RUN pip install Flask gunicorn
COPY app/ /app
WORKDIR /app
EXPOSE 8000
CMD gunicorn --bind=0.0.0.0:8000 "app.__init__.create_app()"
碼頭工人-compose.yml
docker-compose:
version: '3'
services:
web:
build: .
ports: ['5000:5000']
volumes: ['./app:/app']
當我運行docker-compose up --build時,應用程式抱怨找不到模塊“應用程式”:
web_1 | ModuleNotFoundError: No module named 'app'
由于測驗套件和其他一些因素,我無法更改為from constants import MYCONSTANT,所以我不確定如何解決這個問題。我嘗試將 gunicorn 行更改為,CMD gunicorn --bind=0.0.0.0:8000 "__init__:create_app()"但隨后出現此匯入錯誤:
web_1 | from .constants import MYCONSTANT
web_1 | ImportError: attempted relative import with no known parent package
uj5u.com熱心網友回復:
您的問題的核心是您丟失了一層目錄。您正在從該/app目錄運行 GUnicorn,并嘗試匯入 Python模塊,但與您開始的目錄app沒有關系。./app/__init__.py
您的第一步應該是從檔案中洗掉該volumes:塊。docker-compose.yml特別是如果您遇到目錄布局問題,在整個應用程式代碼上安裝一些東西會使問題難以除錯,并且您會得到不同的結果,具體取決于當前系統檢查的內容。應用程式代碼內置在映像中,因此無需單獨注入。
在 Dockerfile 中,我會避??免將檔案復制到容器根目錄中。重要的是確保將app子目錄從構建背景關系復制到app當前目錄的子目錄中。
FROM python:3.6-alpine
# Switch out of the root directory before copying anything in.
# (This directory is frequently named /app; picking something
# different for clarity.)
WORKDIR /web
# Install Python dependencies. (Keep this as a separate early step
# so repeated `docker build` goes faster.)
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy in the main application source.
COPY app/ ./app/ # <-- *** note, ./app relative to WORKDIR
# Set metadata for how to run the container.
EXPOSE 8000
CMD gunicorn --bind=0.0.0.0:8000 "app.__init__.create_app()"
version: '3.8'
services:
web:
build: .
ports: ['5000:5000']
# no volumes: required
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436833.html
上一篇:如何在Flask中防止暴力破解
下一篇:在子類中重用建構式引數
