Docker 错误:无法导入 'hello' ,没有这样的命令 'uvicorn'

问题描述 投票:0回答:1

我目前正在创建一个链接 Flask 和 mysql 的应用程序,并使用 Docker Compose 简单地运行它。

  1. 在 dockerfile 中导入“hello”时出错

我不确定问题 1 是 Docker 文件问题还是 hello.py 问题。

如果您运行 python hello.py 而不是 Docker 文件,服务器将正常运行。

但是,如果您使用 Docker Compose 进行构建并在 Docker Desktop 上进行检查,则可以确认发生了问题。下面是相应的代码。

enter image description here

你好.py

## 1
from db_module import db_connector

from flask import Flask

app = Flask(__name__)

@app.route('/', methods = ['GET', 'POST'])
def alarm():
    result = db_connector()    
    return result



if __name__ == "__main__":              
    app.run(host="0.0.0.0", port="8000")

db_module.py

import pymysql
from flask  import Flask


def db_connector():
    
  db = pymysql.connect(host='127.0.0.1', user='root', password='', db='mysql', 
  charset='utf8')

  cursor = db.cursor()


  sql = "select *from user"


  cursor.execute(sql)

  result = cursor.fetchall()

  db.close()

  return str(result)

Dockerfile

FROM python:3.8-slim

COPY . .

RUN pip3 install -r requirements.txt

WORKDIR /backend/app

ENV FLASK_APP=hello.py
EXPOSE 8000

CMD ["python", "-m","flask","uvicorn","run", "bash","--host=0.0.0.0","--port", "8000"]

docker-compose.yml

version: '3.8'

services:
 web:
 build: "./app"
 ports:
  - "8000:8000"
 db:
  image: mysql:8.0
  environment:
    MYSQL_ROOT_PASSWORD: ""
    ports:  
       - "80:80"
  volumes:
       - mysqldb:/var/lib/mysql



volumes:
  mysqldb:

2.没有这样的命令“独角兽”

目前,requirement.txt 文件中列出了“unicorn”,但我不确定为什么没有显示这样的命令。

需求.txt

Flask
mysql-connector
uvicorn

enter image description here

docker flask
1个回答
0
投票

这里有几个问题。

首先,正如 David Maze 指出的,你把东西安装在了错误的地方。您将文件安装到容器的根目录中,但随后更改为

/backend/app
,因此 python 无法找到这些文件。

其次,你的

CMD
语法没有任何意义。

解决这两个问题将如下所示:

FROM python:3.8-slim

WORKDIR /backend/app
COPY . .
RUN pip3 install -r requirements.txt

EXPOSE 8000

CMD ["uvicorn", "--host=0.0.0.0","--port", "8000", "hello:app"]

为了提高效率,您应该先安装

requirements.txt
并执行软件包安装:

FROM python:3.8-slim

WORKDIR /backend/app
COPY requirements.txt ./
RUN pip3 install -r requirements.txt
COPY . .

EXPOSE 8000

CMD ["uvicorn", "--host=0.0.0.0","--port", "8000", "hello:app"]

此时您已经有了一个可以启动的容器,但仍然有一个问题:

uvicorn
设计用于与 FastAPI 或 Quartz 等异步框架一起使用;它不适用于 Flask 应用程序。

您要么需要使用 gunicorn 而不是

uvicorn
,或者改用 FastAPI 而不是 Flask。

© www.soinside.com 2019 - 2024. All rights reserved.