【问题标题】:Flask Docker app not serving API and no files found inside docker imageFlask Docker 应用程序不提供 API,并且在 docker 映像中找不到文件
【发布时间】:2020-05-04 17:23:04
【问题描述】:

我有一个烧瓶应用程序,想通过 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 什么也没返回。它是空的。

这是我的文件夹结构:

以下是我的 docker 配置:

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"]

Docker 撰写:

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)

请指教。非常感谢任何帮助。

【问题讨论】:

  • Dockerfile 存在问题 - 您有 2 个 CMD,这意味着只考虑最后一个。尝试用 RUN 替换第一个 CMD
  • 将 CMD 替换为 RUN。似乎还没有运行。跟路径有关吗?
  • 所以创建一个新脚本(entrypoint.sh)并将这个脚本作为CMD,在entrypoint.sh执行必要的步骤,如设置和启动应用程序。
  • 所以我在 entrypoint.sh 中输入 CMD python setup.py develop 并在 dockerfile 中调用该文件?我在关注这个:michal.karzynski.pl/blog/2016/06/19/…
  • 即使您在使用双 cmd 时没有遇到问题,您仍然应该将卷中的内容挂载。尝试使用./ 而不是.

标签: python docker flask docker-compose flask-restplus


【解决方案1】:

问题可能是您的项目没有MANIFEST.in 文件。当setup.py 执行时,它会查找要包含在您的项目中的其他文件。完整的教程可以在here找到。

您的项目文件夹可能看起来像这样。

recursive-include src/*
recursive-include src/api *
recursive-include src/api/controllers *
recursive-include src/api/controllers/endpoints *

【讨论】:

  • 谢谢。现在试试看。会回来报告的。
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2018-09-02
  • 2017-06-04
  • 2019-05-24
  • 2020-09-10
相关资源
最近更新 更多