Код Flask выполняется индивидуально, но при контейнере с докером страница недоступна - PullRequest
0 голосов
/ 06 октября 2019

У меня есть модель глубокого обучения, я развернул ее с помощью фляги, и она отлично работает, когда я отправляю почтовый запрос через почтальона, я упаковал приложение в докер, докер, кажется, собирается и работает нормально, но хост всегда недоступен,Спасибо за любую помощь, спасибо!

Я попытался изменить номера портов и т. Д. EXPOSE 5000, и я запустил докер, используя docker run -p 5000: 5000 "name". Кажется, ничего не работает.

Это файл Docker-

FROM python:3.6
RUN pip3 install opencv-contrib-python-headless
COPY ./flask_code.py /deploy/
COPY ./requirements.txt /deploy/
COPY ./ResNet50_model_weights.h5 /deploy/
WORKDIR /deploy/
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python", "flask_code.py", "production"]

Это мой flask_code.py

from io import BytesIO
import pickle
import numpy as np
from flask import Flask, request
import pandas as pd
import tensorflow as tf
import keras
from keras.models import load_model
from keras.models import model_from_json
import os
import cv2
from PIL import Image
import base64

model = None
app = Flask(__name__)

def readb64(base64_string):
    sbuf = BytesIO()
    sbuf.write(base64.b64decode(base64_string))
    pimg = Image.open(sbuf)
    return cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR)

def load_model_flask():
    global model
    # model variable refers to the global variable
    model = load_model("ResNet50_model_weights.h5") 


@app.route('/')
def home_endpoint():
    return 'Hello World!'


@app.route('/predict', methods=['POST'])
def get_prediction():
    # Works only for a single sample
    if request.method == 'POST':
        data = request.get_json()  # Get data posted as a json
        print(data['string'][:5])
        gray = readb64(data['string'])
        print(gray.shape)
        gray = cv2.resize(gray, (300,300), interpolation = cv2.INTER_AREA)
        print("after", gray.shape)

        gray = np.expand_dims(gray, axis=0)
        print(gray.shape)
        pred = model.predict(gray)
        #print(pred)
        #data = np.array(data)[np.newaxis, :]  # converts shape from (4,) to (1, 4)
        #prediction = model.predict(data)  # runs globally loaded model on the data
        print("The class of this garbage is:")
        index = np.argmax(pred[0],axis = 0)

    return str(index+1)


if __name__ == '__main__':
    load_model_flask()  # load model at the beginning once only
    app.run(host='127.0.0.1',debug = False, threaded = False)

Flask_code.py работает нормально, когда я запускаю его по отдельности.

Я ожидаю, что получу сообщение "hello world", когда перейду на http://127.0.0.1:5000/, вместо этого будет написано "Соединение было установлено"

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Похоже, я не достаточно Google. Я нашел точное решение, подробно объясненное здесь. https://pythonspeed.com/articles/docker-connection-refused/

0 голосов
/ 06 октября 2019
app.run(host='127.0.0.1',debug = False, threaded = False)

Вы связываете свое приложение с локальным узлом контейнера, поэтому оно недоступно с хоста.

Измените это тоже

app.run(host='0.0.0.0',debug = False, threaded = False)

Так что оно станет доступнымот хозяина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...