首页 > 解决方案 > 无法将简单的烧瓶应用程序部署到 azure Web 应用程序

问题描述

我正在尝试将一个非常简单的烧瓶应用程序部署到 linux azure web 应用程序,但似乎找不到任何已安装的软件包

它使用虚拟环境在本地主机上工作

这是文件夹 startup.py 上的应用程序代码:

from flask import Flask
from flask_restful import Resource, Api

class Index(Resource):
    def get(self):
        return "Hellow World"

app = Flask(__name__)
api = Api(app)
api.add_resource(Index, "/home")

我正在尝试使用 azure DevOps 管道部署应用程序,这是我的 azure-pipeline.yml 文件(我删除了这篇文章的变量)

variables:
  ConnectedServiceName: <name of my service connection>
  WebAppName: <name of my web app>


pool:
  name: Hosted Ubuntu 1604

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.6'
    architecture: 'x64'

- script: pip install -r requirements.txt
  displayName: 'Install requirements'

- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(Build.SourcesDirectory)'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/Application$(Build.BuildId).zip'
    replaceExistingArchive: true
    #verbose: # (no value); this input is optional

- task: AzureRMWebAppDeployment@4
  displayName: Azure App Service Deploy
  inputs:
    appType: webAppLinux
    RuntimeStack: 'PYTHON|3.6'
    ConnectedServiceName: $(ConnectedServiceName)
    WebAppName: $(WebAppName)
    Package: '$(Build.ArtifactStagingDirectory)/Application$(Build.BuildId).zip'

    StartupCommand: 'gunicorn --bind=0.0.0.0 --workers=4 startup:app'

这是我的 requirements.txt 文件

aniso8601==7.0.0
astroid==2.2.5
Click==7.0
colorama==0.4.1
Flask==1.1.1
Flask-JWT-Extended==3.22.0
Flask-RESTful==0.3.7
flask-swagger-ui==3.20.9

管道运行所有步骤且没有错误 部署映像

但似乎 wwwroot 文件夹中没有包

/home>cd site/wwwroot
/home/site/wwwroot>pip freeze
virtualenv==16.6.2
/home/site/wwwroot> 

还尝试pip install -r requirements.txt站在这个文件夹中,它收集软件包但永远不会安装它们(它永远显示“清理...>”)

在应用程序日志中我可以看到

ModuleNotFoundError: No module named 'flask_restful'
2019-09-04T14:55:19.215300670Z [2019-09-04 14:55:19 +0000] [39] [INFO] Worker exiting (pid: 39)
2019-09-04T14:55:19.234394151Z [2019-09-04 14:55:19 +0000] [38] [ERROR] Exception in worker process

如何确保 Web 应用程序使用 requirements.txt 中列出的包

有什么想法可能是错的吗?

标签: pythonazureflaskazure-web-app-serviceflask-restful

解决方案


试图创建一个示例管道 -

pool:
  name: Azure Pipelines
steps:
- task: UsePythonVersion@0
  displayName: 'Use Python 3.6'
  inputs:
    versionSpec: 3.6

- task: PythonScript@0
  displayName: 'Run a Python script'
  inputs:
    scriptSource: inline
    script: 'pip install -r req.txt'
  enabled: false

- script: 'pip install -r req.txt --target=$(Build.BinariesDirectory)'
  displayName: 'Command Line Script'

- task: CopyFiles@2
  displayName: 'Copy Files to: $(Build.BinariesDirectory)'
  inputs:
    TargetFolder: '$(Build.BinariesDirectory)'

- task: ArchiveFiles@2
  displayName: 'Archive $(Build.BinariesDirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'

- task: AzureWebApp@1
  displayName: 'Azure Web App Deploy: '
  inputs:
    azureSubscription: ''
    appType: webAppLinux
    appName: 
    package: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
    runtimeStack: 'PYTHON|3.6'

PublishBuildArtifacts - 此处不需要,但可用于验证将发布到 webapp 的实际构建工件。您可以尝试验证包是否存在于工件中。


推荐阅读