运行FastAPI官方模板”I found on GitHub the “Full Stack FastAPI and PostgreSQL – Base Project Generator” (2023年05月版)”
总结
我有些事情需要用到 FastAPI 项目。
我知道有官方的模板,但维护工作在2020年6月就停止了,而且即使运行 docker-compose up -d,也无法正常工作。因此,我进行了一些修改,暂时让它能够正常运行至少一部分。
這是關於修改項目的備忘錄。(如果處理積壓的公關問題,應該可以修正。)
因此
创建项目
请按照官方网站上的“如何使用”步骤来生成项目。
所以,一旦创建了项目,让我们首先不要思考任何事情,尝试使用 docker-compose up -d 启动容器组。
如果按照所期望的那样,应该会出现错误。
关于前端的 fork-ts-checker-webpack-plugin-v5 的错误。
当出现类似于 fork-ts-checker-webpack-plugin-v5 的错误时,它是在前端部分发生的情况。
– 正在进行生产环境构建…
错误 错误:找不到模块’fork-ts-checker-webpack-plugin-v5′
错误:找不到模块’fork-ts-checker-webpack-plugin-v5′
在Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)中
在Function.Module._load (internal/modules/cjs/loader.js:508:25)中
在Module.require (internal/modules/cjs/loader.js:637:17)中
在require (internal/modules/cjs/helpers.js:22:18)中
在api.chainWebpack.config (/app/node_modules/@vue/cli-plugin-typescript/index.js:106:16)中
在webpackChainFns.forEach.fn (/app/node_modules/@vue/cli-service/lib/Service.js:236:40)中
在Array.forEach ()中
在Service.resolveChainableWebpackConfig (/app/node_modules/@vue/cli-service/lib/Service.js:236:26)中
在PluginAPI.resolveChainableWebpackConfig (/app/node_modules/@vue/cli-service/lib/PluginAPI.js:145:25)中
在module.exports (/app/node_modules/@vue/cli-service/lib/commands/build/resolveAppConfig.js:9:22)中
在build (/app/node_modules/@vue/cli-service/lib/commands/build/index.js:147:50)中
在api.registerCommand (/app/node_modules/@vue/cli-service/lib/commands/build/index.js:89:13)中
在Service.run (/app/node_modules/@vue/cli-service/lib/Service.js:230:12)中
在Object. (/app/node_modules/@vue/cli-service/bin/vue-cli-service.js:36:9)中
在Module._compile (internal/modules/cjs/loader.js:701:30)中
在Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)中
npm ERR! 代码 ELIFECYCLE
npm ERR! 错误码 1
npm ERR! 错误号 1
npm ERR! frontend@0.1.0 build:`vue-cli-service build`
npm ERR! 状态 1
npm ERR!
npm ERR! 在 frontend@0.1.0 build 脚本中出现错误。
npm ERR! 这可能不是npm的问题。可能有其他详细日志记录。npm ERR! 可以在以下位置找到完整的运行日志:
npm ERR! /root/.npm/_logs/2023-05-04T04_01_39_533Z-debug.log
错误:服务’frontend’构建失败:命令’/bin/sh -c npm run build’返回了非零代码:1
应对措施
在谷歌中搜索会得到以下这样的页面。
似乎依赖于Node的版本。
我想升级Node的版本,但官方只支持到v10。
于是我在互联网上搜索,发现有一个适用于v16的docker镜像的分支,我们就用它吧。
所以我会进行修正。
- FROM tiangolo/node-frontend:10 as build-stage
+ FROM greenaj/node-frontend:16 as build-stage
为什么 nginx.conf 文件的文件名也被更改了,所以我们也需要修改那里。
FROM nginx:1.15
COPY --from=build-stage /app/dist/ /usr/share/nginx/html
- COPY --from=build-stage /nginx.conf /etc/nginx/conf.d/default.conf
+ COPY --from=build-stage /default.conf /etc/nginx/conf.d/default.conf
COPY ./nginx-backend-not-found.conf /etc/nginx/extra-conf.d/backend-not-found.conf
「诗歌的404错误未找到」
如果在后端出现了404:未找到的错误。
第3/15步:运行curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && cd /usr/local/bin && ln -s /opt/poetry/bin/poetry && poetry config virtualenvs.create false
—> 运行中374e5a279887
文件“”,第1行
404:未找到
^
语法错误:无效的语法
错误:服务’celeryworker’构建失败:命令’/bin/sh -c curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && cd /usr/local/bin && ln -s /opt/poetry/bin/poetry && poetry config virtualenvs.create false’返回了非零代码:1
解决方案 ‘àn)
我看你想要安装 Poetry。
但是,由于安装位置的 URL 发生了变化,所以出现了错误。
我将按照以下方式更改安装位置的 URL。
我会把后端的两个Dockerfile都重写一遍。
# Install Poetry
- RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \
+ RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
cd /usr/local/bin && \
ln -s /opt/poetry/bin/poetry && \
poetry config virtualenvs.create false
# Install Poetry
- RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | POETRY_HOME=/opt/poetry python && \
+ RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
cd /usr/local/bin && \
ln -s /opt/poetry/bin/poetry && \
poetry config virtualenvs.create false
花朵发生错误,无法启动。
如果花朵发生错误并无法启动。
正在创建full-stack-fastapi-postgresql_db_1 … 已完成
正在创建full-stack-fastapi-postgresql_flower_1 … 错误
正在创建full-stack-fastapi-postgresql_queue_1 … 已完成
正在创建full-stack-fastapi-postgresql_frontend_1 … 已完成
正在创建full-stack-fastapi-postgresql_proxy_1 … 已完成
正在创建full-stack-fastapi-postgresql_pgadmin_1 …
正在创建full-stack-fastapi-postgresql_backend_1 …
正在创建full-stack-fastapi-postgresql_celeryworker_1 …错误:无法启动flower服务 full-stack-fastapi-postgresql_flower_1: 正在创建full-stack-fastapi-postgresql_pgadmin_1 … 已完成
正在创建full-stack-fastapi-postgresql_backend_1 … 已完成
正在创建full-stack-fastapi-postgresql_celeryworker_1 … 已完成
错误:无法启动flower服务 flower:无法创建shim任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:exec:“–broker=amqp://guest@queue:5672//”:stat –broker=amqp://guest@queue:5672//: 没有该文件或目录:未知
错误:在启动项目时遇到错误。
应对措施
不知道原因是什么,但似乎新版本不行。
既然如此,为了暂时使其运行起来,我会使用评论中提到的旧版本来进行操作。
flower:
- image: mher/flower
+ image: mher/flower:0.9.7
networks:
- ${TRAEFIK_PUBLIC_NETWORK?Variable not set}
- default
env_file:
后端出现 AttributeError 错误:模块 ‘h11’ 没有 ‘Event’ 属性。
当到达此处时,表面上看似乎正在运作,但实际上可能并未动作。
通过运行docker-compose ps命令进行确认,结果如下。
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
full-stack-fastapi- /start-reload.sh Exit 1
postgresql_backend_1
full-stack-fastapi- bash /worker-start.sh Exit 1
postgresql_celeryworker_1
full-stack-fastapi- docker-entrypoint.sh postgres Up 5432/tcp
postgresql_db_1
full-stack-fastapi- flower --broker=amqp://gue ... Up 0.0.0.0:5555->5555/tcp,:::5555->
postgresql_flower_1 5555/tcp
full-stack-fastapi- nginx -g daemon off; Up 80/tcp
postgresql_frontend_1
full-stack-fastapi- /entrypoint.sh Up 443/tcp, 0.0.0.0:5050->5050/tcp,
postgresql_pgadmin_1 :::5050->5050/tcp, 80/tcp
full-stack-fastapi- /entrypoint.sh --providers ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp
postgresql_proxy_1 , 0.0.0.0:8090->8080/tcp,:::8090
->8080/tcp
full-stack-fastapi- docker-entrypoint.sh rabbi ... Up 15691/tcp, 15692/tcp, 25672/tcp,
postgresql_queue_1 4369/tcp, 5671/tcp, 5672/tcp
后端和celeryworker崩溃了,退出码为1。
因此,让我们从后端中使用docker-compose logs backend来检查。
当我试图查看时,出现了错误信息:AttributeError:模块’h11’没有’Event’属性。
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/__init__.py”的第1行
backend_1 | 来自 .connection 导入 HTTPConnection
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/connection.py”的第13行
backend_1 | 来自 .http11 导入 HTTP11Connection
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/http11.py”的第44行
backend_1 | 类 HTTP11Connection(ConnectionInterface):
backend_1 | 文件“/usr/local/lib/python3.7/site-packages/httpcore/_sync/http11.py”的第144行
backend_1 | self, event: h11.Event, timeout: Optional[float] = None
backend_1 | AttributeError: 模块 ‘h11’ 没有属性 ‘Event’
应对方法
经过调查,似乎是与依赖于httpcore库的版本有关的问题。
因此,让我们将 httpcore 版本固定为较旧的版本,并将其添加到 pyproject.toml 中。
[tool.poetry.dependencies]
python = "^3.7"
uvicorn = "^0.11.3"
fastapi = "^0.54.1"
...
python-jose = {extras = ["cryptography"], version = "^3.1.0"}
httpcore = "<=0.15"
importlib-metadata = "<5"
+ httpcore = "<=0.15"
修改后,请重建docker-compose构建并启动。
celeryworker发生AttributeError错误:’EntryPoints’对象没有’get’属性。
如果 celeryworker 出现 AttributeError: ‘EntryPoints’ 对象没有 ‘get’ 属性的错误时,请考虑以下情况。
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/bin/base.py”,第16行,模块名称,来自 celery 中的 VERSION_BANNER,Celery,maybe_patch_concurrency,signals
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/signals.py”,第16行,模块名称,来自 celery.utils.dispatch 中的 Signal
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/utils/__init__.py”,第19行,模块名称,来自 celery.utils.nodenames 中的 nodename,nodesplit,worker_direct
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/celery/utils/nodenames.py”,第9行,模块名称,来自 kombu.entity 中的 Exchange,Queue
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/entity.py”,第9行,模块名称,来自 .serialization 中的 prepare_accept_content
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/serialization.py”,第456行,模块名称,entrypoints(‘kombu.serializers’) 中的 ep,args(覆盖率不适用)
celeryworker_1 | 文件 “/usr/local/lib/python3.7/site-packages/kombu/utils/compat.py”,第93行,模块名称,importlib_metadata.entry_points().get(namespace,[]) 中的 ep
celeryworker_1 | AttributeError: ‘EntryPoints’ 对象没有 ‘get’ 属性
对策 (duì cè)
似乎是依赖于 importlib-metadata 库的版本的问题。
那么,让我们将 importlib-metadata 的版本固定为旧版本。我们在 pyproject.toml 中进行追加。
[tool.poetry.dependencies]
python = "^3.7"
uvicorn = "^0.11.3"
fastapi = "^0.54.1"
...
python-jose = {extras = ["cryptography"], version = "^3.1.0"}
httpcore = "<=0.15"
importlib-metadata = "<5"
httpcore = "<=0.15"
+ importlib-metadata = "<5"
修改后,执行 docker-compose build celeryworker 进行重新构建,然后再运行。
他动了!
修正完之后,我们先刷新一下页面。
docker-compose stop
docker-compose build
docker-compose up -d
当您运行`docker-compose ps`命令时,所有服务应该都已经启动了。
Name Command State Ports
--------------------------------------------------------------------------------------------------------------
full-stack-fastapi- /start-reload.sh Up 80/tcp, 0.0.0.0:8888->8888/tcp,::
postgresql_backend_1 :8888->8888/tcp
full-stack-fastapi- bash /worker-start.sh Up
postgresql_celeryworker_1
full-stack-fastapi- docker-entrypoint.sh postgres Up 5432/tcp
postgresql_db_1
full-stack-fastapi- flower --broker=amqp://gue ... Up 0.0.0.0:5555->5555/tcp,:::5555->5
postgresql_flower_1 555/tcp
full-stack-fastapi- nginx -g daemon off; Up 80/tcp
postgresql_frontend_1
full-stack-fastapi- /entrypoint.sh Up 443/tcp, 0.0.0.0:5050->5050/tcp,:
postgresql_pgadmin_1 ::5050->5050/tcp, 80/tcp
full-stack-fastapi- /entrypoint.sh --providers ... Up 0.0.0.0:80->80/tcp,:::80->80/tcp,
postgresql_proxy_1 0.0.0.0:8090->8080/tcp,:::8090->8
080/tcp
full-stack-fastapi- docker-entrypoint.sh rabbi ... Up 15691/tcp, 15692/tcp, 25672/tcp,
postgresql_queue_1 4369/tcp, 5671/tcp, 5672/tcp
以上!辛苦了! yǐ, kǔ le!)