![](/img/trans.png)
[英]Unable access Dockerized Flask app at http://localhost:5000
[英]Unable to access the routes of a dockerized flask application from a web server
我有一个 flask 应用程序,即使使用 docker,它也可以在 localhost 中完美运行。 但是一旦我部署它,它就不再起作用了。 我后面有一个 404 错误,浏览器回答:
未找到 在服务器上未找到请求的 URL。 如果您手动输入了 URL,请检查您的拼写并重试。
当我从我的服务器 curl localhost:5010/helloworld 得到一个空答案.. 我不知道为什么,但似乎 flask 服务器没有重新启动:
WARNING:root:no config found for parameter None default mode debug loaded
WARNING:flask_cors.core:Unknown option passed to Flask-CORS: headers
WARNING:flask_cors.core:Unknown option passed to Flask-CORS: headers
* Serving Flask app "application" (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
INFO:werkzeug: * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit)
INFO:werkzeug: * Restarting with stat
WARNING:root:no config found for parameter None default mode debug loaded
WARNING:flask_cors.core:Unknown option passed to Flask-CORS: headers
WARNING:flask_cors.core:Unknown option passed to Flask-CORS: headers
WARNING:werkzeug: * Debugger is active!
INFO:werkzeug: * Debugger PIN: 899-121-971
运行.py:
from application import create_app, db
import sys
from OpenSSL import SSL
context = SSL.Context(SSL.PROTOCOL_TLSv1_2)
context.use_privatekey_file('./ssl/server.key')
context.use_certificate_file('./ssl/server.crt')
# we set the app default value is debug
appStartingMode= None
if(len (sys.argv) >1):
appStartingMode= sys.argv[1]
app = create_app(appStartingMode)
if __name__ == "__main__":
app.debug = True
app.use_reloader = True
app.run(host=app.config['FLASK_HOST'], port=app.config['FLASK_PORT'],ssl_context = context)
Dockerfile:
FROM python:3.9.1
EXPOSE 5000
# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
WORKDIR /app
COPY . /app
# Switching to a non-root user, please refer to https://aka.ms/vscode-docker-python-user-rights
RUN useradd appuser && chown -R appuser /app
USER appuser
# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD [ "python", "./run.py" ]
docker-compose.yml 的提取物:
bel-backend:
container_name: bel-backend
env_file: database-variables.env
build:
context: /home/ubuntu/sob/sob-2020-back-end
ports:
- 5010:5000
depends_on :
- mysql-server
我尝试访问的路线:
@app.route('/helloworld', methods=['GET'])
def helloWorld():
print("ok")
return 'Hello World !'
通过键入: https://ipofthemachine:5010/helloworld即使 https 被删除,因为我必须更新我的证书。 有任何想法吗?
[编辑]
如果我分享 config.py 会更好:
from os import environ, path
from dotenv import load_dotenv
basedir = path.abspath(path.dirname(__file__))
load_dotenv(path.join(basedir, '.env'))
class Config:
"""Base config."""
SECRET_KEY = environ.get('SECRET_KEY')
'''
SESSION_COOKIE_NAME = environ.get('SESSION_COOKIE_NAME')
STATIC_FOLDER = 'static'
TEMPLATES_FOLDER = 'templates'
'''
class DebugConfig(Config):
# General Flask Config
FLASK_ENV = 'development'
DEBUG = False
#TESTING = True
FLASK_APP = 'run.py'
FLASK_PORT=5000
FLASK_HOST='0.0.0.0'
# Database
SQLALCHEMY_DATABASE_URI = environ.get('SQLALCHEMY_DATABASE_URI')
SQLALCHEMY_ECHO = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
添加到路由脚本的底部
if __name__ == '__main__':
app.run(host='0.0.0.0')
@Dunski 我回答是因为如果我编辑主要帖子会很长..
所以我按照你说的做了:我对 app.run 进行了硬编码。 我现在有:
appStartingMode= None
if(len (sys.argv) >1):
appStartingMode= sys.argv[1]
app = create_app(appStartingMode)
Dockerfile:
FROM python:3.9.1
EXPOSE 5000
# Install pip requirements
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
WORKDIR /app
COPY . /app
# Switching to a non-root user, please refer to https://aka.ms/vscode-docker-python-user-rights
RUN useradd appuser && chown -R appuser /app
USER appuser
# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug
CMD ["flask", "run", "-host", "0.0.0.0", "-port", "5000"]
还有我在 docker-compose 中读到的 .env 文件:
user=root
password=*****
host=mysql
port=3306
database=bel_2020_db
SECRET_KEY=secret
FLASK_APP=run.py
FLASK_ENV=development
FLASK_DEBUG=0
SQLALCHEMY_DATABASE_URI=mysql://${user}:${password}@${host}:${port}/${database
}?charset=utf8mb4&binary&binary_prefix=true
SQLALCHEMY_ECHO=0
SQLALCHEMY_TRACK_MODIFICATIONS=0
现在,我尝试使用服务器本身的 ip 地址来 curl docker ... 服务器确实收到请求,但返回 404...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.