前言
-
概括的来讲,在进行本地开发时应该尽量使用 Docker 以保证操作系统等环境因素不会造成与线上环境表现的不一致。
-
不要使用 Flask 自带的 HTTP Server,因为它的表现和线上环境非常不一样(比如它会完全忽略
@uwsgidecorators.postfork
装饰器,导致各种线程、log handler 等无法初始化)。如果觉得每次使用 Docker 打包镜像太耗时,可以在本机运行 uwsgi(uwsgi --ini deploy/uwsgi-local.ini
)。反例:已发现 everyclass-auth 在 Mac 上通过 uwsgi 运行会出现线程有关的问题,只能在 Docker 容器中运行。
本地开发环境的搭建
以下以 everyclass-server 为例,讲述本地开发环境的搭建。在开始前,请确保安装了 Docker Desktop。
- 首先我们需要新建一个本地使用的配置文件来覆盖默认的配置文件。在
[包名]/config
文件夹中新建development.py
。如对于 everyclass-server,应该在everyclass/server/config
中新建development.py
,内容格式如下:
对于布尔类型、字符串类型的配置项,from everyclass.server.config.default import Config class DevelopmentConfig(Config): DEBUG = False SECRET_KEY = 'development key' [其他配置项]
DevelopmentConfig
会完全覆盖Config
(默认配置文件)中的内容;对于字典类型的配置项,DevelopmentConfig
只会增量覆盖Config
中的 key。关于配置文件覆盖的方式,具体可以参考config/__init__.py
。
另外需要注意的是,因为之后服务在容器中运行,如果需要连接本地的数据库等服务,host 应该设置为能在容器内连接到宿主机的值(在 Windows 和 Mac 中为host.docker.internal
,要求 Docker 版本大于18.03)。MONGODB = { 'host': 'host.docker.internal', 'port': 27017 }
- 在启动某个服务前,请先确保它的上游服务已经启动。如对于everyclass-server,你可能需要确保 everyclass-api-server 和 everyclass-auth 已经在本地启动(如果有的话,当然也可以使用其他主机上运行的服务),并且在
development.py
中指定:
API_SERVER_BASE_URL = 'http://host.docker.internal:5002'
AUTH_BASE_URL = 'http://host.docker.internal:5003'
- 然后我们生成本地使用的 Docker 镜像文件。在项目文件夹中运行:
sh deploy/local-build.sh
- 最后启动运行。在项目文件夹中运行:
sh deploy/local-run.sh