python - Flask Docker 应用程序不提供 API,并且在 docker 映像中找不到文件
问题描述
我有一个烧瓶应用程序,想通过 docker 将其容器化。通常我使用它运行应用程序flask run
,它在端口 8888 上提供 API。但是,当我尝试使用 docker 运行它时,API 没有启动。我使用构建图像docker-compose build --no-cache
并开始使用docker-compose -f docker-compose.yml up
,容器启动。我使用docker exec -it covid-api /bin/bash
, 我到达root@d0659f0c1627:/app#
并且 ls 什么也不返回。它是空的。
这是我的文件夹结构:
下面是我的码头配置:
FROM python:3.7-stretch
WORKDIR /app
COPY ./badproxy /etc/apt/apt.conf.d/99fixbadproxy
RUN apt-get update \
&& apt-get install -y curl apt-utils gcc build-essential apt-transport-https ca-certificates \
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y msodbcsql17 unixodbc-dev mssql-tools locales \
&& echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& locale-gen
COPY .flaskenv ./
COPY requirements.txt ./
RUN pip install -r requirements.txt
ENV FLASK_ENV=development
ENV PATH="/opt/mssql-tools/bin:${PATH}"
COPY . ./
CMD python setup.py develop
CMD ["flask", "run", "-h", "0.0.0.0", "-p", "8888"]
码头工人组成:
version: '3.7'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- '6000:6000'
environment:
SECRET_BASE_KEY: 'development-secret'
volumes:
- .:/app
restart: unless-stopped
networks:
mynetwork:
aliases:
- web.myname.test
networks:
mynetwork:
driver: bridge
src/app.py:
import logging.config
import os
from flask import Flask, Blueprint
from flask_cors import CORS
from werkzeug.middleware.proxy_fix import ProxyFix
from src.config import default
from src.api.controllers.endpoints.users import ns as users_namespace
from src.api.controllers.endpoints.statuses import ns as status_namespace
from src.api import api
from src.database import db
app = Flask(__name__)
CORS(app)
app.wsgi_app = ProxyFix(app.wsgi_app)
logging_conf_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '../logging.conf'))
logging.config.fileConfig(logging_conf_path)
log = logging.getLogger(__name__)
def configure_app(flask_app):
flask_app.config['SERVER_NAME'] = default.FLASK_SERVER_NAME
flask_app.config['SQLALCHEMY_DATABASE_URI'] = default.SQLALCHEMY_DATABASE_URI
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = default.SQLALCHEMY_TRACK_MODIFICATIONS
flask_app.config['SWAGGER_UI_DOC_EXPANSION'] = default.RESTPLUS_SWAGGER_UI_DOC_EXPANSION
flask_app.config['RESTPLUS_VALIDATE'] = default.RESTPLUS_VALIDATE
flask_app.config['RESTPLUS_MASK_SWAGGER'] = default.RESTPLUS_MASK_SWAGGER
flask_app.config['ERROR_404_HELP'] = default.RESTPLUS_ERROR_404_HELP
return flask_app
def initialize_app(flask_app):
configure_app(flask_app)
blueprint = Blueprint('CovidAPI', __name__, url_prefix='/')
api.init_app(blueprint)
api.add_namespace(users_namespace)
api.add_namespace(status_namespace)
flask_app.register_blueprint(blueprint)
db.init_app(flask_app)
return flask_app
app = initialize_app(app)
# def main():
# initialize_app(app)
# log.info('>>>>> Starting development server at http://{}/ <<<<<'.format(app.config['SERVER_NAME']))
# app.run(debug=default.FLASK_DEBUG)
if __name__ == "__main__":
log.info('>>>>> Starting development server at http://{}/ <<<<<'.format(app.config['SERVER_NAME']))
app.run(debug=default.FLASK_DEBUG)
请指教。非常感谢任何帮助。
解决方案
问题可能是您的项目没有MANIFEST.in
文件。执行时,setup.py
它会查找要包含到您的项目中的其他文件。完整的说明可以在这里找到。
您的项目文件夹可能看起来像这样。
recursive-include src/*
recursive-include src/api *
recursive-include src/api/controllers *
recursive-include src/api/controllers/endpoints *
推荐阅读
- asp.net - 读取嵌入在 aspx 页面中的 xml
- asp.net-mvc - 在没有 AspNetCore Web 应用程序的情况下使用存储在 Razor 类库 3.0 (RCL) 中的 Razor 模板
- c# - .net core 3 equivalnet 配置用于添加 xml 序列化
- java - 在远程调试中暂停 Spring Boot Java 应用程序时,ECS 代理停止并重新启动 Docker 容器
- c# - 当我在 MVC 视图中尝试第二页时,ToPagedList 没有给出值
- git - 主分支更改后合并开发分支(已提交)
- javascript - 显示另一个div后如何显示div
- java - Spring Boot 中的 ObjectMapper 可以读取字符串,但在解析标头时不起作用
- ios - 证书和配置配置文件混淆 Xcode
- uwp - 通用应用程序中的动态菜单