Python 为什么我的端口没有在docker compose中映射?
我目前有一个用Flask编写的用于与CNN交互的小api,我正在设置configuracion,以便在Docker中运行它,一切正常,这是我的实际配置: Dockerfile:Python 为什么我的端口没有在docker compose中映射?,python,docker,flask,Python,Docker,Flask,我目前有一个用Flask编写的用于与CNN交互的小api,我正在设置configuracion,以便在Docker中运行它,一切正常,这是我的实际配置: Dockerfile: FROM python:2.7.15-jessie RUN mkdir -p usr/src/app COPY . usr/src/app WORKDIR usr/src/app RUN which python RUN apt-get update && apt-get install -y RUN p
FROM python:2.7.15-jessie
RUN mkdir -p usr/src/app
COPY . usr/src/app
WORKDIR usr/src/app
RUN which python
RUN apt-get update && apt-get install -y
RUN pip install flask flask_uploads Werkzeug opencv-python numpy tensorflow
ENV PORT 5000
EXPOSE 5000
CMD ["flask", "run"]
Docker compose:
version: "2.2"
services:
api:
container_name: "pyserver"
build: .
volumes:
- ".:/usr/src/app"
environment:
FLASK_APP: server.py
ports:
- "5000:5000"
command: ["flask", "run"]
server.py
import os
from base64 import b64encode, b64decode
from flask import Flask, redirect, request, url_for, json, send_file
from flask_uploads import UploadSet, configure_uploads
from werkzeug.utils import secure_filename
from GW_predict import predict
UPLOAD_FOLDER = 'CNN/Files'
ALLOWED_EXTENSIONS = set(['txt', 'csv', 'png', 'jpg', 'jpeg'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config["DEBUG"] = True
def allowed_file(filename):
ext = '.' in filename and \
filename.rsplit('.', 1)[1].lower()
return ext, ext in ALLOWED_EXTENSIONS
@app.route('/status', methods=['GET'])
def status():
return create_response({ 'online': True, 'message': 'UP AND RUNNING @ 5000' }, 200)
@app.route('/uploadFile', methods=['POST'])
def upload_file():
if 'h1' not in request.files or 'l1' not in request.files:
return create_response({'result': False, 'message': 'File missing'}, 422)
h1_file = request.files['h1']
l1_file = request.files['l1']
if h1_file.filename == '' or l1_file.filename == '':
return create_response({'result': False, 'message': 'File missing'}, 422)
h1_ext, h1res = allowed_file(h1_file.filename)
l1_ext, l1res = allowed_file(l1_file.filename)
if h1_file and l1_file and h1res and l1res:
h1_filename = secure_filename(h1_file.filename)
l1_filename = secure_filename(l1_file.filename)
h1 = os.path.join(app.config['UPLOAD_FOLDER'], h1_filename)
l1 = os.path.join(app.config['UPLOAD_FOLDER'], l1_filename)
h1_file.save(h1)
l1_file.save(l1)
# img = b64encode((open(img, "rb").read()))
if h1_ext == 'png' and l1_ext == 'png':
result = predict(h1, l1)
return create_response({'result': True, 'prediction': result}, 200)
return create_response({'result': False, 'message': 'Images format must be png'}, 422)
return create_response({'result': False, 'message': 'No allowed file'}, 422)
def create_response(message, status):
response = app.response_class(
response= json.dumps(message),
status= status,
mimetype='application/json'
)
return response
if __name__ == '__main__':
app.run()
问题是,在docker compose文件中,我配置了“ports”指令,在该指令中,我定义在主机中公开de port 5000,并转发到容器中的同一端口
这是行不通的
在容器内部,我可以通过CURL向端点发出请求,但在容器外部,我无法这样做。可能有什么问题?可能需要指定
--host=0.0.0.0
标志?(来自)
您能否尝试覆盖docker compose中的命令
version: "2.2"
services:
api:
container_name: "pyserver"
build: .
command: flask run --host=0.0.0.0
volumes:
- ".:/usr/src/app"
environment:
FLASK_APP: server.py
ports:
- "5000:5000"
command: ["flask", "run"]
顺便说一下,如果您仅从主机(而不是其他容器)进行通信,则不确定是否需要dockerfile中的
EXPOSE
也许您需要指定--host=0.0.0.0
标志?(来自)
您能否尝试覆盖docker compose中的命令
version: "2.2"
services:
api:
container_name: "pyserver"
build: .
command: flask run --host=0.0.0.0
volumes:
- ".:/usr/src/app"
environment:
FLASK_APP: server.py
ports:
- "5000:5000"
command: ["flask", "run"]
顺便说一下,如果您仅从主机(而不是其他容器)进行通信,则不确定是否需要dockerfile中的
EXPOSE
docker ps
显示了什么?什么都没有:/,但是docker ps-a
显示了这个:>06bd82268dc9 cnn\u api“烧瓶运行”22分钟前上升4秒0.0.0.0:5000->5000/tcp pyserver
您可以共享在容器内工作的curl代码和在容器外不工作的curl代码吗。另外,您能否确认主机上还没有5000个应用程序?您的应用程序在容器内监听哪些接口?有关如何在不在映像内安装网络工具的情况下检查此问题,请参阅。@Const-inside:curlhttp://localhost:5000/status
,外部:curlhttp://localhost:5000/status
,curlhttp://127.0.0.1:5000/status
docker ps(docker ps),但是docker ps-a
显示:>06bd82268dc9 cnn_-api“flask run”22分钟前上升4秒0.0.0.0:5000->5000/tcp pyserver
您能否共享用于容器内部工作的curl和外部不工作的curl的代码。另外,您能否确认主机上还没有5000个应用程序?您的应用程序在容器内监听哪些接口?有关如何在不在映像内安装网络工具的情况下检查此问题,请参阅。@Const-inside:curlhttp://localhost:5000/status
,外部:curlhttp://localhost:5000/status
,curlhttp://127.0.0.1:5000/status
它们(外部)中没有一个工作得很好(因此我的评论是询问接口)。如果flask默认为环回,则无法从外部访问它。您还可以在python脚本中app.run(host='0.0.0',port='5000')
。@BMitch right,只是尝试给出一个快速的解决方案,看看是否就是这样..就是这样!谢谢你,伙计。添加标志使其工作。根据您的expose注释,除了文档之外,不需要它。当发布端口或在容器之间通信时,它对docker网络的行为没有影响。是的,我知道它除了文档之外没有任何作用。谢谢你的时间,伙计@BMitchPretty确定就是这样(因此我的评论是询问接口)。如果flask默认为环回,则无法从外部访问它。您还可以在python脚本中app.run(host='0.0.0',port='5000')
。@BMitch right,只是尝试给出一个快速的解决方案,看看是否就是这样..就是这样!谢谢你,伙计。添加标志使其工作。根据您的expose注释,除了文档之外,不需要它。当发布端口或在容器之间通信时,它对docker网络的行为没有影响。是的,我知道它除了文档之外没有任何作用。谢谢你的时间,伙计@体重指数