Flask + PyArmor 混淆代码部署到 Docker 容器,通过 Gunicorn 启动报错 RuntimeError: unauthorised use of script
问题描述 :
最近在使用 Flask 编写一个服务脚本后,为了代码保护,我通过 PyArmor 对代码进行了混淆,并将生成的 dist 目录打包到 Docker 镜像中,使用 Gunicorn 作为代理启动服务。然而,容器启动后访问服务时,却报错 RuntimeError: unauthorised use of script,导致服务无法正常运行。
报错信息:
bash
[...]
Traceback (most recent call last):
File "app.py", line 1, in <module>
from re_service import app
RuntimeError: unauthorised use of script
解决步骤:
- 排查问题根源 :
初步判断是 PyArmor 混淆后的代码在容器环境中无法通过授权验证。PyArmor 会对混淆代码进行加密和授权检查,若环境未通过验证,则会触发该报错。 - 重新生成混淆代码 :
尝试重新使用 PyArmor 生成混淆文件,并指定输出目录到dist: - 此命令会重新生成
dist目录下的混淆文件,并确保授权信息正确写入。 - 替换 Docker 镜像中的
**dist**目录 :
将新生成的dist目录替换原有镜像中的对应目录,并重新构建镜像。 - 启动容器验证 :
使用 Gunicorn 启动服务(示例命令): - 此时服务已能正常启动,不再报错。
原因分析:
- 授权验证失败 :PyArmor 混淆后的代码需要验证运行环境是否合法(例如通过许可证文件或环境变量)。在容器环境中,可能因以下原因导致验证失败:
- 未正确配置 PyArmor 的许可证(
license.lic)或环境变量。 - 混淆时指定的入口文件路径与实际运行环境不一致。
- 未正确配置 PyArmor 的许可证(
pyarmor gen -O dist re_service.py的作用 :-O dist:指定输出目录为dist,覆盖原有混淆文件。re_service.py:指定入口脚本,确保混淆时正确生成依赖文件和授权信息。
重新生成可能修正了授权信息或文件路径问题,使容器环境通过验证。