我目前正在创建一个链接 Flask 和 mysql 的应用程序,并使用 Docker Compose 简单地运行它。
- 在 dockerfile 中导入“hello”时出错
我不确定问题 1 是 Docker 文件问题还是 hello.py 问题。
如果您运行 python hello.py 而不是 Docker 文件,服务器将正常运行。
但是,如果您使用 Docker Compose 进行构建并在 Docker Desktop 上进行检查,则可以确认发生了问题。下面是相应的代码。
## 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")
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)
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"]
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”,但我不确定为什么没有显示这样的命令。
Flask
mysql-connector
uvicorn
这里有几个问题。
首先,正如 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。