An Azure service that provides hosted, universal storage for Azure app configurations.
The most likely cause is that App Service is starting with sh startup.sh, but the file is not present in the deployed runtime content that the app actually starts from, even though it exists in the source repository.
Supported reasons from the documented behavior:
- Startup commands must resolve relative to the project root
For Linux Python apps, all commands in a custom startup command or startup command file must use paths relative to the project root folder. If App Service cannot resolvestartup.shfrom the deployed app root, startup fails with the exact kind of error shown. - A successful deployment pipeline does not guarantee the startup file is in the runtime content
App Service documentation explicitly says that if the expected startup behavior does not occur, verify that the startup command file is deployed to App Service along with the app code. This matches the symptom: deployment succeeded, but the runtime container cannot openstartup.sh. - For Python on Linux, App Service falls back to framework detection if the custom startup command fails
App Service ignores errors while processing a custom startup command or file and then continues looking for Django or Flask apps. That means the deployment can appear successful while startup still fails because the custom file is missing or invalid. - The deployed content, not the repo, determines startup
The Python troubleshooting guidance says to use SSH and verify files undersite/wwwroot. If the files are not there, the issue is with what was deployed or mounted, not with the repository contents.
Given the current configuration, the practical explanation is:
-
startup.shexists in source control. - The package mounted or extracted for the running app does not contain
startup.shat the app root that App Service is using. - After the SKU upgrade/restart, the app restarted against the actual deployed package, exposing that mismatch.
Checks to run:
- Verify the file in the running app
Open an SSH session to the app and check whethersite/wwwroot/startup.shexists. The guidance for Python App Service specifically recommends verifying files undersite/wwwroot. - Confirm the deployment artifact layout
Ensure the deployment package placesstartup.shin the package root, not inside a subfolder. App Service expects the startup command path relative to the project root. - Review deployment logs
In Azure portal: Deployment Center > Logs > latest Commit ID > Show Logs next to Running oryx build. These logs can reveal whether expected files were included or whether the dependency/build layout differs from what App Service expects. - Check whether the app is showing the default app or startup failure symptoms
If needed, use Diagnose and solve problems and review Application Logs, Container Crash, and Container Issues. - If the file is missing from
site/wwwroot, correct the deployment package
The Kudu publish behavior for startup artifacts shows that startup scripts on Linux are expected underhome/site/wwwroot/startup.shby default when deployed as a startup artifact. If the package or deployment task is not placing the file there, App Service will not find it.
What this means for the root cause:
- The SKU upgrade itself is not documented as changing startup command semantics.
- The documented failure mode is consistent with the startup script not being present at the deployed app root or not being referenced with the correct relative path.
- Since
SCM_DO_BUILD_DURING_DEPLOYMENTis0, there is no build step correcting package layout during deployment, so App Service starts only from what was packaged and deployed.