[编辑]

我正在try 将一个简单的Flask 项目记录下来.当我使用docker运行项目时,我一直遇到这个错误.另一方面,当我使用python3测试瓶正常运行它时,该项目运行得很好.py公司

Docker文件

FROM python:3.9.6-slim

# https://www.lifewithpython.com/2021/05/python-docker-env-vars.html
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONUTF8=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=on

RUN apt-get update \
    && apt-get install --no-install-recommends -y \
    curl \
    wget \
    unzip \
    jq \
    ffmpeg \
    libsndfile1-dev \
    && rm -rf /var/lib/apt/lists/*

RUN wget "https://download.pytorch.org/whl/cpu/torch-1.10.2%2Bcpu-cp39-cp39-linux_x86_64.whl" \
    && pip install torch-1.10.2+cpu-cp39-cp39-linux_x86_64.whl

RUN mkdir app

WORKDIR /app

COPY README.md .
COPY requirements.txt .
COPY setup.py .
COPY src ./src
RUN pip install .

# COPY main.py .
COPY test_flask.py .

CMD [ "python", "test_flask.py", "run", "--host", "0.0.0.0"]

docker compose .yml公司

version: '3.9'
services:
  asr-cpu-local:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
    - ./data:/data
    - ./models:/models
    ports:
    - 127.0.0.1:8000:8000

在终端和Docker容器日志(log)中,在我用Docker运行它之后,它完全没有显示任何错误

* Serving Flask app 'test_flask' (lazy loading)

* Environment: production

  WARNING: This is a development server. Do not use it in a production deployment.

  Use a production WSGI server instead.

* Debug mode: on

* Running on http://127.0.0.1:8000 (Press CTRL+C to quit)

* Restarting with stat

有关更多信息,我已运行docker端口进行判断,但仍出现错误:

docker port <container-name>
8000/tcp -> 127.0.0.1:8000

用于文件test_Flask .py:

from flask import Flask
app = Flask(__name__)
import librosa
from src.jrasr.predictors import Wav2vec2bert2bertPredictor


MODEL_CONFIG = {
    "name": "Wav2vec2bert2bertPredictor",
    "version": "0.0.1",
    "models": [
        {
            "name": "wav2vec2",
            "dir": "/models/wav2vec2-base-csj-kana-v0.0.1"
        },
        {
            "name": "bert2bert",
            "dir": "/models/bert2bert-csj-kana-v0.0.1"
        }
    ]
}


@app.before_first_request
def load_model_to_app():
    # Load the model
    app.predictor = Wav2vec2bert2bertPredictor(MODEL_CONFIG)

@app.route('/')
def index():
    return "This is Home Page"

@app.route('/data/<audio_path>')
def predict(audio_path):
    model = app.predictor
    audio_path = "/data/"+audio_path
    data, _ = librosa.load(audio_path, sr=16000, mono=True, duration=10)
    words = model.predict(data)
    result = "".join(words)
    return result
 
if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8000, debug=True)

但是当我try 访问终端和Docker容器日志(log)中所示的Ip地址时,我发现127.0.0.1拒绝连接,如下图所示.问题是在终端和docker日志(log)中,没有任何错误消息,但我仍然无法访问它,有人能告诉我,如何解决我的问题吗?

Error at the local browser

推荐答案

127.0.0.1localhost接口,当在容器内运行时,只有容器可以访问它.为了能够在容器外部访问,应该使用专用IP 0.0.0.0来绑定所有接口.

解决方案1

将主机更改为0.0.0.0,而不是test_flask.py中的127.0.0.1.类似于下面的代码片段.

WARNING:由于0.0.0.0将所有接口绑定到外部世界,如果在本地而不是在容器中运行,则可能存在安全风险.也就是说,推荐使用解决方案2(Python源代码中的127.0.0.1).因此,当直接在本地运行它时,它绑定到localhost,当在容器中运行它时,它绑定容器本身的外部世界.

...

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

解决方案2

On the other hand, to run it passing the host as an argument the Dockerfile should be changed to the following:

...

ENV FLASK_APP=test_flask
CMD ["flask", "run", "--host=0.0.0.0"]

使用连接到http://localhost:8000/http://127.0.0.1:8000/的浏览器进行测试

Python相关问答推荐

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

在np数组上实现无重叠的二维滑动窗口

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

实现自定义QWidgets作为QTimeEdit的弹出窗口

使用Python更新字典中的值

提取相关行的最快方法—pandas

Plotly Dash Creating Interactive Graph下拉列表

跳过嵌套JSON中的级别并转换为Pandas Rame

干燥化与列姆化的比较

Cython无法识别Numpy类型

不允许 Select 北极滚动?

如何使用matplotlib查看并列直方图

如何在Django模板中显示串行化器错误

有没有一种方法可以在朗肯代理中集成向量嵌入

仅取消堆叠最后三列

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

使用pythonminidom过滤XML文件

将参数从另一个python脚本中传递给main(argv