python - 在没有docker的情况下运行正常时拒绝使用docker连接本地ip地址

标签 python docker flask docker-compose dockerfile

<分区>

[已编辑]

我正在尝试对一个简单的 Flask 项目进行 docker 化。当我使用 docker 运行项目时,我一直收到此错误。另一方面,当我使用 python3 test-flask.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 容器日志中,我用 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 port查看,但是还是报错:

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)

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

Error at the local browser

最佳答案

127.0.0.1localhost 接口(interface),当在容器内运行时,只有容器可以访问它。要在容器外访问,它应该是特殊 IP 0.0.0.0 来绑定(bind)所有接口(interface)。

方案一

test_flask.py 中将主机更改为 0.0.0.0 而不是 127.0.0.1。类似于以下代码段。

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

...

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

解决方案2

另一方面,要运行它,将主机作为参数传递,Dockerfile 应更改为以下内容:

...

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

用连接到http://localhost:8000/http://127.0.0.1:8000/

的浏览器进行测试

关于python - 在没有docker的情况下运行正常时拒绝使用docker连接本地ip地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72933716/

相关文章:

python - Twisted/Cyclone/Tornado 的高阶网络框架/附加组件(网络登录/用户/管理员)?

Python线在同一个图上绘制多个时间序列

python - 使用 Python 和机器学习 (LSTM) 预测 future 'x' 天的股票价格

.net - 在运行 Jenkins 的 Docker 容器中拒绝 Dotnet 构建权限

python - 哪种方法更好地重置 Pandas 数据框中的索引?

ruby - Ruby 应用程序的 Dockerfile - 为什么将 WORKDIR 指定为/usr/src/app

docker - 如何更改docker默认网络?

python - WTForms 2.3.0 重大更改 - ImportError : cannot import name 'HTMLString' from 'wtforms.widgets'

python :unit test throws <Response streamed [200 OK]> instead of actual output

flask - alembic:在修订文件中创建关系