共用方式為


將容器化的 Python 應用程式部署至 App Service

本文是如何將 Python Web 應用程式容器化和部署至 Azure App 服務 的教學課程的一部分。 App Service 可讓您執行容器化 Web 應用程式,並透過 Docker Hub、Azure Container Registry 和 Visual Studio Team Services 的持續整合/持續部署 (CI/CD) 功能進行部署。

在本教學課程的這個部分中,您將瞭解如何使用適用於容器App Service Web 應用程式,將容器化的 Python Web 應用程式部署至 App Service。 適用於容器的 Web 應用程式可讓您專注於撰寫容器,而不必擔心管理和維護基礎容器協調器。

遵循這裡的步驟,您最終會使用 Docker 容器映像來使用 App Service 網站。 App Service 會使用受控識別從 Azure Container Registry 提取初始映射以進行驗證。

以下顯示的服務圖表會反白顯示本文所涵蓋的元件。

A screenshot of the services using in the Tutorial - Containerized Python App on Azure with deployment path highlighted.

1.建立 Web 應用程式

Azure CLI 命令可以在 Azure Cloud Shell 或已安裝 Azure CLI 的工作站上執行

步驟 1: 使用 az group show 命令,取得包含 Azure Container Registry 之群組的資源識別符。

# RESOURCE_GROUP_NAME='msdocs-web-app-rg'

RESOURCE_ID=$(az group show \
  --resource-group $RESOURCE_GROUP_NAME \
  --query id \
  --output tsv)
echo $RESOURCE_ID

在上述命令中,RESOURCE_GROUP_NAME仍應該在您的環境中設定為您在第 3 部分中 使用的資源組名。在本教學課程的 Azure 中建置容器。 如果不是,請取消批注第一行,並確定它已設定為您使用的名稱。

步驟 2。 使用 az appservice plan create 命令建立 App Service 方案。

APP_SERVICE_PLAN_NAME='msdocs-web-app-plan'

az appservice plan create \
    --name $APP_SERVICE_PLAN_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --sku B1 \
    --is-linux

步驟 3。 使用 az webapp create 命令建立 Web 應用程式。

下列命令也會為 Web 應用程式啟用 系統指派的受控識別 ,並在指定的資源上指派 AcrPull 角色 ,在此案例中為包含 Azure Container Registry 的資源群組。 這會授與資源群組中任何 Azure Container Registry 的系統指派受控識別提取許可權。

APP_SERVICE_NAME='<website-name>'
# REGISTRY_NAME='<your Azure Container Registry name>'
CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'

az webapp create \
  --resource-group $RESOURCE_GROUP_NAME \
  --plan $APP_SERVICE_PLAN_NAME \
  --name $APP_SERVICE_NAME \
  --assign-identity '[system]' \
  --scope $RESOURCE_ID \
  --role acrpull \
  --deployment-container-image-name $CONTAINER_NAME 

在上述命令中:

  • APP_SERVICE_NAME必須是全域唯一的,因為它會成為URL https://<website-name>.azurewebsites.net中的網站名稱。
  • CONTAINER_NAME的格式為 「yourregistryname.azurecr.io/repo_name:tag」。
  • 您的環境中仍應將REGISTRY_NAME設定為您在第 3 部分中 使用的登錄名稱。在本教學課程的 Azure 中建置容器。 如果不是,請取消批注上面設定的行,並確定它已設定為您使用的名稱。

注意

執行 命令時,您可能會看到類似下列的錯誤:

No credential was provided to access Azure Container Registry. Trying to look up...
Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'

因為 Web 應用程式預設使用 Azure Container Registry 的系統管理員認證向登錄進行驗證,而且登錄上尚未啟用管理員認證,因此會發生此錯誤。 您可以放心地忽略此錯誤,因為您會在下一個命令中將 Web 應用程式設定為使用系統指派的受控識別進行驗證。

2.設定受控識別和 Webhook

步驟 1: 使用 az webapp config set 命令,將 Web 應用程式設定為使用受控識別從 Azure Container Registry 提取。

az webapp config set \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --generic-configurations '{"acrUseManagedIdentityCreds": true}'

因為您在建立 Web 應用程式時已啟用系統指派的受控識別,所以它會是用來從 Azure Container Registry 提取的受控識別。

步驟 2。 使用 az webapp deployment list-publishing-credentials 命令取得應用程式範圍認證。

CREDENTIAL=$(az webapp deployment list-publishing-credentials \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --query publishingPassword \
  --output tsv)
echo $CREDENTIAL 

步驟 3。 使用應用程式範圍認證,使用 az acr webhook create 命令建立 Webhook。

SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook'

az acr webhook create \
  --name webhookforwebapp \
  --registry $REGISTRY_NAME \
  --scope msdocspythoncontainerwebapp:* \
  --uri $SERVICE_URI \
  --actions push 

根據預設,此命令會在與指定的 Azure Container Registry 相同的資源群組和位置中建立 Webhook。 如有需要,您可以使用 --resource-group--location 參數來覆寫此行為。

3.設定與 MongoDB 的連線

在此步驟中,您會指定連線到 MongoDB 所需的環境變數。

如果您需要建立適用於 MongoDB 的 Azure Cosmos DB,建議您遵循步驟,在第 2 部分中設定適用於 MangoDB 的 Cosmos DB。在本教學課程的本機建置和測試容器。 當您完成時,應該會有適用於 MongoDB 的 Azure Cosmos DB 連接字串 格式mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>

您需要 MongoDB 連接字串 資訊,才能遵循下列步驟。

若要在 App Service 中設定環境變數,請使用下列 az webapp config appsettings set 命令建立應用程式設定

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING:開頭為 “mongodb://” 的 連接字串。
  • DB_NAME:使用 「restaurants_reviews」。。
  • COLLECTION_NAME:使用“restaurants_reviews”。

4.瀏覽網站

若要確認網站正在執行中,請移至 https://<website-name>.azurewebsites.net;其中網站名稱是您的應用程式服務名稱。 如果成功,您應該會看到餐廳檢閱範例應用程式。 網站可能需要一些時間才能第一次啟動。 當網站出現時,請新增餐廳,以及該餐廳的檢閱,以確認範例應用程式正常運作。

如果您在本機執行 Azure CLI,您可以使用 az webapp browse 命令瀏覽至網站。 如果您使用 Cloud Shell,請開啟瀏覽器視窗並瀏覽至網站 URL。

az webapp browse  --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME 

注意

az webapp browse Cloud Shell 不支援命令。 開啟瀏覽器視窗,並改為瀏覽至網站URL。

5.針對部署進行疑難解答

如果您沒有看到範例應用程式,請嘗試下列步驟。

  • 使用容器部署和 App Service,請一律檢查 Azure 入口網站 中的 [部署中心 / 記錄] 頁面。 確認容器已提取並正在執行。 容器的初始提取和執行可能需要一些時間。
  • 嘗試重新啟動App Service,並查看這是否解決了您的問題。
  • 如果有程式設計錯誤,這些錯誤會顯示在應用程式記錄中。 在 App Service 的 [Azure 入口網站] 頁面上,選取 [診斷並解決問題/應用程式記錄]。
  • 範例應用程式依賴 MongoDB 的連線。 確認 App Service 具有具有正確連線資訊的應用程式設定。
  • 確認 App Service 已啟用受控識別,並用於部署中心。 在 App Service 的 [Azure 入口網站] 頁面上,移至 App Service 部署中心資源,並確認 [驗證] 設定為 [受控識別]。
  • 檢查是否已在 Azure Container Registry 中定義 Webhook。 Webhook 可讓 App Service 提取容器映像。 特別是,檢查服務 URI 是否以 “/api/registry/webhook” 結尾。
  • 不同的 Azure Container Registry SKU 有不同的功能,包括 Webhook 數目。 如果您要重複使用現有的登錄,您可能會看到下列訊息:「針對登錄 SKU 基本的資源類型 Webhook 超過配額。 深入瞭解不同的 SKU 配額和升級程式: https://aka.ms/acr/tiers"。 如果您看到此訊息,請使用新的登錄,或減少使用中的登錄 Webhook 數目

後續步驟