Hey,
I'm currently working on my college project and tried deploying my Flask application to Azure App Service. However, I keep running into an error that no module named 'run' (the startup file is run.py in the root folder).
The root directory contains the requirements.txt file as well as run.py.
I am using Github Actions as the build provider. The build completes successfully, i.e. all the modules are being downloaded correctly, but the deployment fails.
I use the following startup command:gunicorn --bind=0.0.0.0 --timeout 600 run:app
Complete logs:
2021-05-18T12:53:22.997524952Z
2021-05-18T12:53:22.997560752Z _____
2021-05-18T12:53:22.997567552Z / _ \ __________ _________ ____
2021-05-18T12:53:22.997581752Z / /_\ \___ / | \_ __ \_/ __ \
2021-05-18T12:53:22.997587552Z / | \/ /| | /| | \/\ ___/
2021-05-18T12:53:22.997592052Z \____|__ /_____ \____/ |__| \___ >
2021-05-18T12:53:22.997596452Z \/ \/ \/
2021-05-18T12:53:22.997600652Z
2021-05-18T12:53:22.997604452Z A P P S E R V I C E O N L I N U X
2021-05-18T12:53:22.997608552Z
2021-05-18T12:53:22.997612252Z Documentation: http://aka.ms/webapp-linux
2021-05-18T12:53:22.997616252Z Python 3.7.9
2021-05-18T12:53:22.997620052Z Note: Any data outside '/home' is not persisted
2021-05-18T12:53:23.205563707Z Starting OpenBSD Secure Shell server: sshd.
2021-05-18T12:53:23.283939727Z Site's appCommandLine: gunicorn --bind=0.0.0.0 --timeout 600 run:app
2021-05-18T12:53:23.285423428Z Launching oryx with: create-script -appPath /home/site/wwwroot -output /opt/startup/startup.sh -virtualEnvName antenv -defaultApp /opt/defaultsite -bindPort 8000 -userStartupCommand 'gunicorn --bind=0.0.0.0 --timeout 600 run:app'
2021-05-18T12:53:23.336032241Z Cound not find build manifest file at '/home/site/wwwroot/oryx-manifest.toml'
2021-05-18T12:53:23.339104742Z Could not find operation ID in manifest. Generating an operation id...
2021-05-18T12:53:23.339214842Z Build Operation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
2021-05-18T12:53:24.163744357Z Oryx Version: 0.2.20210225.2, Commit: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, ReleaseTagName: 20210225.2
2021-05-18T12:53:24.638606083Z Writing output script to '/opt/startup/startup.sh'
2021-05-18T12:53:25.301612860Z WARNING: Could not find virtual environment directory /home/site/wwwroot/antenv.
2021-05-18T12:53:25.302387060Z WARNING: Could not find package directory /home/site/wwwroot/__oryx_packages__.
2021-05-18T12:53:26.135877784Z [2021-05-18 12:53:26 +0000] [35] [INFO] Starting gunicorn 20.0.4
2021-05-18T12:53:26.135913684Z [2021-05-18 12:53:26 +0000] [35] [INFO] Listening at: http://0.0.0.0:8000 (35)
2021-05-18T12:53:26.135919984Z [2021-05-18 12:53:26 +0000] [35] [INFO] Using worker: sync
2021-05-18T12:53:26.135924184Z [2021-05-18 12:53:26 +0000] [38] [INFO] Booting worker with pid: 38
2021-05-18T12:53:26.135928284Z [2021-05-18 12:53:26 +0000] [38] [ERROR] Exception in worker process
2021-05-18T12:53:26.135932284Z Traceback (most recent call last):
2021-05-18T12:53:26.135936284Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
2021-05-18T12:53:26.135940484Z worker.init_process()
2021-05-18T12:53:26.135944284Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/workers/base.py", line 119, in init_process
2021-05-18T12:53:26.135960884Z self.load_wsgi()
2021-05-18T12:53:26.135965284Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
2021-05-18T12:53:26.135969384Z self.wsgi = self.app.wsgi()
2021-05-18T12:53:26.135973184Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
2021-05-18T12:53:26.135977084Z self.callable = self.load()
2021-05-18T12:53:26.135980784Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
2021-05-18T12:53:26.135984784Z return self.load_wsgiapp()
2021-05-18T12:53:26.135988584Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
2021-05-18T12:53:26.135992584Z return util.import_app(self.app_uri)
2021-05-18T12:53:26.135996284Z File "/opt/python/3.7.9/lib/python3.7/site-packages/gunicorn/util.py", line 358, in import_app
2021-05-18T12:53:26.136000284Z mod = importlib.import_module(module)
2021-05-18T12:53:26.136003984Z File "/opt/python/3.7.9/lib/python3.7/importlib/__init__.py", line 127, in import_module
2021-05-18T12:53:26.136007984Z return _bootstrap._gcd_import(name[level:], package, level)
2021-05-18T12:53:26.136012484Z File "", line 1006, in _gcd_import
2021-05-18T12:53:26.136017084Z File "", line 983, in _find_and_load
2021-05-18T12:53:26.136021084Z File "", line 965, in _find_and_load_unlocked
2021-05-18T12:53:26.136025084Z ModuleNotFoundError: No module named 'run'
2021-05-18T12:53:26.136029084Z [2021-05-18 12:53:26 +0000] [38] [INFO] Worker exiting (pid: 38)
2021-05-18T12:53:26.216758106Z [2021-05-18 12:53:26 +0000] [35] [INFO] Shutting down: Master
2021-05-18T12:53:26.217610206Z [2021-05-18 12:53:26 +0000] [35] [INFO] Reason: Worker failed to boot.
Project Structure (Used made-up names of local modules):
|-- GithubRepo
|--- run.py
|--- requirements.txt
|--- app
|--- __init__.py
|--- module1.py
|--- module2.py
|--- templates
|--- static
from app import app
if __name__ == "__main__":
app.run(debug=True)
init.py:
app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Access-Control-Allow-Origin'
Other important facts about the project:
App Service Plan Tier: Basic B1 Plan
Code Source: Github
Build Provider: Github Actions
I used Git LFS to upload a 1 GB ML model on GitHub
SCM_DO_BUILD_DURING_DEPLOYMENT is true
Any help would be appreciated.
Thanks!
EDIT 19-05-2021
Github Workflow .yml file:
name: Build and deploy Python app to Azure Web App - disaster-response
on:
push:
branches:
- runpy
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python version
uses: actions/setup-python@v1
with:
python-version: '3.7'
- name: Create and start virtual environment
run: |
python -m venv venv
source venv/bin/activate
- name: Install dependencies
run: pip install -r requirements.txt
# Optional: Add step to run tests here (PyTest, Django test suites, etc.)
- name: Upload artifact for deployment jobs
uses: actions/upload-artifact@v2
with:
name: python-app
path: |
.
!venv/
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'production'
url: ${
{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: python-app
path: .
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v2
with:
app-name: 'disaster-response'
slot-name: 'production'
publish-profile: ${
{ secrets.xxxxxxxxxxxxxxx_xxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx }}
Kudu Project Structure:
